(++i)*(++i)

Alexandr Malusek malusek na hroch.ujf.cas.cz
Středa Únor 10 17:24:32 CET 1999


Je to delsi, ale snad to vnese trochu svetla do te temnoty ;-)

$ cat e3.c
#define _ -F

int main()
{
 int F=0;
 printf("%d",-_);
 return F;
}

$ gcc -E  e3.c | grep printf
 printf("%d",- -F );

$ gcc -E -traditional-cpp e3.c | grep printf
 printf("%d",--F);

Slovy: Podle ANSI C preprocesor vlozi mezeru, podle stareho C nikoliv.
Tomu odpovida vysledek (0, resp -1).  

> Mimochodem, pokud si v MSVC necham nejdriv vypsat vystup
> preprocesoru a ten pak prelozim, tak to tiskne -1.

Byl-li nastaven ANSI C preprocesor, pak muzete MS napsat bug report.

$ cat e1.c
/* WORLD program
 * by Jack Applin and Robert Heckendorn, 1985
 */
main(v,c)char**c;{for(v[c++]="Hello, world!\n)";
(!!c)[*c]&&(v--||--c&&execlp(*c,*c,c[!!c]+!!c,!c));
**c=!c)write(!!*c,*c,!!**c);}

$ gcc -traditional e1.c -o e1
$ ./e1
Hello, world!

Podobne pro druhy zminovany program dostanete:

$ gcc -traditional e2.c -o e2
$ ./e2
3.141

Pouzil jsem gcc 2.7.2.3, egcs-1.1.1 dava stejne vysledky.

--
A. Malusek  (malusek na ujf.cas.cz)
UJF AV CR


Další informace o konferenci Linux