問題來源:《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;
}