Znalazłem ten program w C z sieci:
#include <stdio.h>
int main(){
printf("C%d\n",(int)(90-(-4.5//**/
-4.5)));
return 0;
}
Interesującą rzeczą w przypadku tego programu jest to, że gdy jest kompilowany i uruchamiany w trybie C89, drukuje, C89
a kiedy jest kompilowany i uruchamiany w trybie C99, drukuje C99
. Ale nie jestem w stanie dowiedzieć się, jak działa ten program.
Czy możesz wyjaśnić, jak działa drugi argument printf
w powyższym programie?
//
komentarz w stylu C ++ został wprowadzony w C99.gcc
. Bezstd=c99
dostaniesz ostrzeżenie, a jeśli je zignorujesz, nadalgcc
będzie interpretować jako początek komentarza (ah - musisz też użyć . Domyślnie mam to włączone).//
-pedantic
C89
z jawnymstd=c89
w gcc 4.9.2.#if __STDC_VERSION__ >= 199901L
, a nie//
sztuczki z komentarzem. =)Odpowiedzi:
C99 pozwala na
//
komentarze w stylu, C89 nie. A więc do przetłumaczenia:C99:
printf("C%d\n",(int)(90-(-4.5 /*Some comment stuff*/ -4.5))); // Outputs: 99
C89:
printf("C%d\n",(int)(90-(-4.5/ -4.5))); /* so we get 90-1 or 89 */
źródło
komentarz linii
//
jest wprowadzany od C99. Dlatego twój kod jest równy temu w C89#include <stdio.h> int main(){ printf("C%d\n",(int)(90-(-4.5/ -4.5))); return 0; } /* 90 - (-4.5 / -4.5) = 89 */
i równe temu w C99
#include <stdio.h> int main(){ printf("C%d\n",(int)(90-(-4.5 -4.5))); return 0; } /* 90 - (-4.5 - 4.5) = 99*/
źródło
Ponieważ
//
komentarze istnieją tylko w standardach C99 i nowszych, kod jest równoważny z następującym:#include <stdio.h> int main (void) { int vers; #if __STDC_VERSION__ >= 201112L vers = 99; // oops #elif __STDC_VERSION__ >= 199901L vers = 99; #else vers = 90; #endif printf("C%d", vers); return 0; }
Poprawny kod to:
#include <stdio.h> int main (void) { int vers; #if __STDC_VERSION__ >= 201112L vers = 11; #elif __STDC_VERSION__ >= 199901L vers = 99; #else vers = 90; #endif printf("C%d", vers); return 0; }
źródło