天天看點

C語言嵌套注釋問題

問題來源:《C陷阱與缺陷》

練習1-1.     某些C編譯器允許嵌套注釋。請寫一個測試程式,要求:無論是對允許嵌套注釋的編譯器,還是對不允許嵌套注釋的編譯器,該程式都能正常通過編譯(無錯誤消息出現),但是這兩種情況下程式執行的結果卻不相同。

提示:被雙引号括起來的字元串中,注釋符****/開始讨論。對允許嵌套注釋的編譯器,後面的字元都是注釋的一部分,而對不允許注釋的編譯器,這就是一個完整的注釋了。

        然後我們在後面加上"*/",變成"*/"。對允許嵌套注釋的編譯器,"*/"等效于一個引号;對不允許注釋的編譯器"*/"等效于字元串"*/"。此時對允許嵌套注釋的編譯器無法通過編譯,即剩下一個引号,我的想法是把這個引号給注釋掉,由于是在C++的編譯器,我直接就在引号前面添加了兩幹,變成"*///",有點投機取巧的意味。

        但用C的注釋符也是可以的,在"*/"後面加上**/"*/"**/"*/"**/"*/""完成注釋。故最終的字元串為"*/"。

        在作者的解答裡面有一個很神奇神奇的答案:0*1

        大家就自己分析下啦!挺有趣的!

以下是最終寫的程式的代碼,包含以上提到的幾種方案,很簡單

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char* str=("hello world");
    /*/**/str="*///hello world";
    printf("%s\n",str);
    str=/*/**/"*/"/*"/**/;
    printf("%s\n",str);
    int i = /*/*/0*/**/1;
    printf("%d\n",i);
    system("pause");
    return 0;
}