Ono prvo nije legalno ali drugo i trece jeste legalno.
Zasto ono prvo nije?
Zato sto kompajler ne zna da li je a-b jednako nuli. To ti se vidi u toku izvrsavanja programa. Tu ono const samo znaci da promenjive a i b ne smes da menjas ali kompajler ne posmatra njihove vrednosti i ne zna koje su njihove vrednosti prilikom racunanja izraza a-b. To ti program izracuna u toku rada. Da si stavio #define onda bi radilo.
U izrazu "An integer constant expression with the value 0" ono
integer constant expression se odnosi na izraz koji je konstanta prilikom kompajliranja. Recimo (2*3-1-1-2*2)
Fora je sto ce i prvi slucaj da ti radi na windowsu jer null pointer ima vrednost nula ali ti nece raditi na nekim masinama gde null pointer nema vrednost nula.
Citat:
srki objasni ovo:
ISO-IEC 9899--1999 (E)
7.17/3
The macros are NULL which expands to an implementation-defined null pointer constant;
Da, ali je standardom definisano i null pointer constant (to si ti prvi put citirao)
4.10 A null pointer constant is an integral constant expression rvalue of integer type that evaluates to zero.
Znaci 0, 2-2, 5*5-25 itd....
Onaj faq je zaista super. Ja znam da sam ga jos odavno procitao celog makar dvaput.