• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            無我

            讓內心永遠燃燒著偉大的光明的精神之火!
            靈活的思考,嚴謹?shù)膶崿F(xiàn)
            豪邁的氣魄、頑強的意志和周全的思考

            C語言嵌套注釋

                      《C陷阱與缺陷》中有一個有意思的問題:“某些C編譯器允許嵌套注釋。請寫一個測試程序,要求:無論是對允許嵌套注釋的編譯器,還是對不允許嵌套注釋的編譯器,該程序都能正常通過編譯(無錯誤消息出現(xiàn)),但是這兩種情況下程序執(zhí)行的結果卻不相同。
             (提示:在用引號括起來的字符串中,注釋符I*屬于字符串的一部分,而在注釋中出現(xiàn)的雙引號””又屬于注釋的一部分。)”

                     我覺得這對C的詞法分析挺有意思的。要是聰明的您,有什么辦法呢?

                     以下是作者給出的答案,確實很精妙,尤其第二個。

                     ——為了判斷編譯器是否允許嵌套注釋,必須找到這樣一組符號序列,無論是對于允許嵌套注釋的編譯器,還是不允許嵌套注釋的編譯器,它都是合法的;但是,對于兩類不同的編譯器,它卻意味著不同的事物。這樣一組符號序列不可避免地要涉及嵌套注釋,讓我們從這里開始討論:
                   /*/**/
                   對于一個允許嵌套注釋的C編譯器,無論上面的符號序列后面跟什么,都屬于注釋的一部分;而對于不允許嵌套注釋的C編譯器,后面跟的就是實實在在的代碼內容。也許有人因此想到可以在后面再跟一個用一對引號引起的注釋結束符:
                  /*/**/ "*/"

                   如果允許嵌套注釋,上面的符號序列就等效于一個引號;如果不允許,那么就等效于一個字符串"*I"。因此,我們可以接著在后面跟一個注釋開始符以及一個引號:

                  /*/**/ "*/"/*"
                   如果允許嵌套注釋,上面就等效于用一對引號引起的注釋開始符"/*";如果不允許,那么就等效于一個用引號括起的注釋結束符,后跟一段未結束的注釋。我們可以簡單地讓最后的注釋結束:
                  /*/**/ "*/"/*" /**/
                這樣,如果允許嵌套注釋,上面的表達式就等效于"/*",:如果不允許,那么就等效于,"*/"。

                在我用基本上類似于上面的形式解決這個問題之后,Doug McIlroy發(fā)現(xiàn)了下面這個讓人拍案叫絕的解法:
                /*/*/0*/**/1
                這個解法主要利用了編譯器作詞法分析時的“大嘴法”規(guī)則。如果編譯器允許嵌套注釋,則上式將被解釋為:
                 /*/*/0*/**/1
                兩個/*符號與兩個*/符號正好匹配,所以上式的值就是1。如果不允許嵌套注釋,注釋中的/*將被忽略。因此,即使卿出現(xiàn)在注釋中也沒有特殊的含義:上面的表達式因此將被這樣解釋:
                 /*/*/0*/**/1
               它的值就是0*1,也就是0o

             

               上面利用一個特殊構造的字符串就完成了這個任務,果然精妙!

               而當時我對這個特殊字符串推導時沒有看到希望,用了宏來幫忙,設計了下面的程序:

            #define A /* aaa /* a*/ a
            #define B */

            bool CanNesting()
            {
            #ifdef B
                
            return false;
            #else
                
            return true;
            #endif
            }


               上面程序中,如果支持嵌套,B的宏定義屬于注釋的一部分,所以B應該沒有被定義,函數(shù)返回true。否則,就不支持嵌套,函數(shù)返回false。

            posted on 2011-03-25 17:18 Tim 閱讀(5992) 評論(0)  編輯 收藏 引用 所屬分類: C/C++語言

            <2009年3月>
            22232425262728
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            導航

            統(tǒng)計

            公告

            本博客原創(chuàng)文章,歡迎轉載和交流。不過請注明以下信息:
            作者:TimWu
            郵箱:timfly@yeah.net
            來源:m.shnenglu.com/Tim
            感謝您對我的支持!

            留言簿(9)

            隨筆分類(173)

            IT

            Life

            搜索

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            久久天天婷婷五月俺也去| 女人香蕉久久**毛片精品| 久久人妻AV中文字幕| 国产成人久久精品一区二区三区| .精品久久久麻豆国产精品| 久久久久国色AV免费观看 | 久久久青草久久久青草| 久久天天躁狠狠躁夜夜不卡| 久久精品无码专区免费东京热 | 色成年激情久久综合| 伊人久久综合精品无码AV专区| 久久亚洲国产午夜精品理论片| 国产精品久久婷婷六月丁香| 亚洲国产天堂久久综合网站| 亚洲精品无码久久久影院相关影片| 久久久久女教师免费一区| …久久精品99久久香蕉国产| 亚洲va久久久噜噜噜久久狠狠| 久久天天躁狠狠躁夜夜不卡| 国内精品免费久久影院| 久久国产精品-久久精品| 久久亚洲AV成人无码电影| 久久久亚洲裙底偷窥综合| 亚洲精品综合久久| 无码乱码观看精品久久| 99精品伊人久久久大香线蕉| 久久er热视频在这里精品| 精品综合久久久久久97超人| 欧美亚洲色综久久精品国产| 亚洲综合伊人久久大杳蕉| 无码国内精品久久人妻| 久久久久久免费视频| 精品熟女少妇AV免费久久| 东方aⅴ免费观看久久av| 久久午夜无码鲁丝片秋霞| 99久久99久久精品国产片果冻| 久久无码AV中文出轨人妻| 久久久久免费精品国产| 久久综合亚洲欧美成人| 国产精品久久久久久久| 99久久综合国产精品二区|