|
Re: lug-bg: Суров печат на кирилица върху Матричен принер
- Subject: Re: lug-bg: Суров печат на кирилица върху Матричен принер
- From: Skeleta <g_georgiev.sz@xxxxxx>
- Date: Thu, 25 Nov 2004 10:18:28 +0200
Nikolay Mitev wrote:
Здравейте
Хайде и аз да се обадя, въпреки че малко оффтопик.
Skeleta wrote:
...
if ((w >= First) & (w <= Last)) w = w-64;
^^^
Това трябва да е &&, а не &. В случая работи, но по случайност. Защо
ли? Ами & е побитова операция, т.е AND-ва *битовете* на левия и десния
израз. В случая работи, защото <= и >= са операции, които връщат bool.
Сега ще кажете, че то е все тая, ама не е. Има една много съществена
разлика м/у & и && и тя е short circuit evaluation. Това означава, че
ако левия израз е false, то целия израз няма как да стане true, и
съответно десния израз може да не се evaluate-ва. В случая това не ни
бърка, но ако десния израз имаше някакъв side-effect (увеличава
променлива, вика функция, и т.н), то ще има огромна разлика м/у
изпълнението на единия и другия вариант.
Казвам всичко това, защото много, ама много често виждам подобни
грешки :-)
Това ми е една от най-дългите програми, които съм писал на C и тя е
правена като превод на програма на Pascal, щото на него си пиша
най-много. В Pascal-а side-effect нещата има стремеж да се отделят от
изчисляването на изрази и принципа е да се счита, че функциите,
участващи в израз са 'чисти'. Затова и стила ми на писане е такъв, за
което се извинявам на C-феновете !
Да не говорим, че може да се поопрости малко:
#include <stdio.h>
/*
(c) Skelet (G. Georgiev) in terms of GNU GPL
Converts cp1251 -> DOS cyrillic.
*/
int main()
{
unsigned char w;
unsigned char First = 0xc0;
unsigned char Last = 0xff;
while (!feof(stdin)) {
w = getchar();
if ((w >= First) && (w <= Last)) w -= 64;
putchar(w);
}
return 0;
}
...
--
Skelet
------ http://skelet.hit.bg/
============================================================================
A mail-list of Linux Users Group - Bulgaria (bulgarian linuxers).
http://www.linux-bulgaria.org - Hosted by Internet Group Ltd. - Stara Zagora
To unsubscribe: http://www.linux-bulgaria.org/public/mail_list.html
============================================================================
|
|
|