Re: lug-bg: Суров печат на кирилица върху Матричен принер
- Subject: Re: lug-bg: Суров печат на кирилица върху Матричен принер
- From: Nikolay Mitev <nikolaymitev@xxxxxxx>
- Date: Thu, 25 Nov 2004 09:59:50 +0200
Здравейте
Хайде и аз да се обадя, въпреки че малко оффтопик.
Skeleta wrote:
<snip>
--------- текст на програмата: -------
#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;
do {
w = getchar();
if (!feof(stdin)) {
if ((w >= First) & (w <= Last)) w = w-64;
^^^
Това трябва да е &&, а не &. В случая работи, но по случайност. Защо ли?
Ами & е побитова операция, т.е AND-ва *битовете* на левия и десния
израз. В случая работи, защото <= и >= са операции, които връщат bool.
Сега ще кажете, че то е все тая, ама не е. Има една много съществена
разлика м/у & и && и тя е short circuit evaluation. Това означава, че
ако левия израз е false, то целия израз няма как да стане true, и
съответно десния израз може да не се evaluate-ва. В случая това не ни
бърка, но ако десния израз имаше някакъв side-effect (увеличава
променлива, вика функция, и т.н), то ще има огромна разлика м/у
изпълнението на единия и другия вариант.
Казвам всичко това, защото много, ама много често виждам подобни грешки :-)
Да не говорим, че може да се поопрости малко:
#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;
}
cheers,
face
============================================================================
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
============================================================================
|