(++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