Как нижеприведенная программа выводит `C89 "при компиляции в режиме C89 и" C99 " при компиляции в режиме C99?
Я нашел эту программу C из интернета:
#include <stdio.h>
int main(){
printf("C%dn",(int)(90-(-4.5//**/
-4.5)));
return 0;
}
интересная вещь с этой программой заключается в том, что когда она компилируется и запускается в режиме C89, она печатает C89
и когда он компилируется и запускается в режиме C99, он печатает C99
. Но я не могу понять, как работает эта программа.
можете ли вы объяснить, как второй аргумент printf
работает в этой программе?
3 ответа:
C99 позволяет
//
-стиль комментариев, C89 не делает. Итак, для перевода: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 */
комментарий к строке
//
вводится с C99. Поэтому ваш код равен этому в C89#include <stdio.h> int main(){ printf("C%d\n",(int)(90-(-4.5/ -4.5))); return 0; } /* 90 - (-4.5 / -4.5) = 89 */
и равны этому в C99
#include <stdio.h> int main(){ printf("C%d\n",(int)(90-(-4.5 -4.5))); return 0; } /* 90 - (-4.5 - 4.5) = 99*/
, потому что
//
комментарии существуют только в стандартах C99 и более поздних, код эквивалентен следующему:#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; }
правильный код будет такой:
#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; }