How does the below program output `C89` when compiled in C89 mode and `C99` when compiled in C99 mode?
the line comment //
is introduced since C99. Therefore your code is equal to this in C89
#include <stdio.h>int main(){ printf("C%d\n",(int)(90-(-4.5/-4.5))); return 0;}/* 90 - (-4.5 / -4.5) = 89 */
and equal to this in C99
#include <stdio.h>int main(){ printf("C%d\n",(int)(90-(-4.5-4.5))); return 0;}/* 90 - (-4.5 - 4.5) = 99*/
Because //
comments only exist in C99 and later standards, the code is equivalent to the following:
#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;}
Correct code would be:
#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;}