2015-06-29 67 views
122

我發現從網絡這個C程序:下面的程序在C89模式下編譯時如何輸出「C89」,當編譯爲C99模式時如何輸出「C99」?

#include <stdio.h> 

int main(){ 

    printf("C%d\n",(int)(90-(-4.5//**/ 
    -4.5))); 

    return 0; 
} 

這個程序有趣的是,當它被編譯並在C89模式下運行,它打印C89,當它被編譯並運行C99模式下,它會打印C99。但我無法弄清楚這個程序是如何工作的。

您能否解釋printf的第二個參數在上述程序中的工作原理?

+44

提示:在C99中引入了C++風格的'//'註釋。 –

+3

不錯的訣竅 - 但它失敗與'gcc'。如果沒有'std = c99',你會得到一個警告,如果你忽略它,'gcc'仍然會*解釋'//'作爲註釋的開始(啊 - 你也必須使用'-pedantic' 。默認情況下是這樣的。) – usr2564301

+3

@Jongware嗯,我在'gcc 4.9.2'中用'std = c89'顯示'C89'。 – ikh

回答

132

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

行註釋//因爲C99引入。因此,你的代碼是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 */ 

等於這個和等於該

#include <stdio.h> 

int main(){ 

    printf("C%d\n",(int)(90-(-4.5 
-4.5))); 

    return 0; 
} 
/* 90 - (-4.5 - 4.5) = 99*/ 
9

因爲//評論僅在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; 
} 
+0

你的答案錯了一個錯誤,當它應該打印89時,你如何得到90? – Pimgd

+1

@Pimgd C89和C90是一回事。 http://stackoverflow.com/questions/17206568/what-is-the-difference-between-c-c99-ansi-c-and-gnu-ca-general-confusion-reg/17209532#17209532 – Lundin

+3

他們的意思是相同的但它不是相同的字符串。站在我原來的問題上。 – Pimgd