How does the below program output `C89` when compiled in C89 mode and `C99` when compiled in C99 mode? How does the below program output `C89` when compiled in C89 mode and `C99` when compiled in C99 mode? c c

How does the below program output `C89` when compiled in C89 mode and `C99` when compiled in C99 mode?


C99 allows //-style comments, C89 does not. So, to translate:

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 */


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;}