本文轉載於:http://www.cnblogs.com/liuxiaoming/archive/2012/08/13/2636831.html
某些C編譯器允許嵌套注釋。請寫一個測試程式,要求:無論是對允許嵌套注釋的編譯器,還是對不允許嵌套注釋的編譯器,該程式都能正常通過編譯,但是這兩種情況下程式執行的結果卻不同。
首先,要說明的是C90隻有一種注釋風格,就是使用“/*”和“*/”,是沒有//注釋符號的。在預先處理階段,C前置處理器會剔除所有出現在“/*”和“*/”之間的內容(包括這對記號本身),所以在接下來傳送到C編譯器的代碼檔案裡是不會出現任何注釋內容的。
下面說明什麼是嵌套注釋:
什麼是注釋呢?注釋就是寫什麼東西都無所謂,反正編譯器不會看到這些東西。很不幸,C前置處理器一般都不支援嵌套注釋,如果你這樣寫:
/*one /* two */*/
是行不通的。因為前置處理器在碰到第一個“*/”時就認為注釋已經結束!於是它把到這裡為止的注釋移除,可想而知,結果留下孤零零一個“*/”—編譯器又報錯了。
但是,同樣一段代碼,對於支援嵌套注釋的的編譯器而言,結果為都注釋掉。因為在two前面的/*會先匹配two後面的*/,one前面的/*匹配最後的*/(目測它與if,else語句的嵌套一樣,就近原則)
好了,知道了什麼是嵌套注釋,讓我們通過一個例子來繼續深入的理解嵌套注釋:
/*/**/ "*/"/*" /**/
對於不支援嵌套注釋的編譯器而言:會將該代碼分為/*/**/, "*/", /**/三個部分,最後的結果是"*/";
對於支援嵌套注釋的編譯器而言:會將該代碼分為/*/**/"*/, "/*", /**/三個部分,最後結果是"/*"。
對於習題1-1,我們可以通過下面的代碼來檢測編譯器是否支援嵌套注釋,具體代目如下:
#include <iostream>#include <cstdio>using namespace std;int main() { int ans = /*/*/0*/**/1; printf("%d\n", ans); return 0;}
/*/*/0*/**/1為 Doug McIlroy 發現,若編譯器支援嵌套注釋,則ans = 1;否則為0