• <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>

            小烏龜

            在夢想的道路上還能走多遠

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
                    讀K&R的The   C   Programmingh   Language   2nd,遇到一疑問,書中說:“盡管可以聲明enum類型的變量,但編譯器不檢查這種類型的變量中存儲的值是否為該枚舉的有效值。不過,枚舉變量提供這種檢查,因此枚舉比#define更具優勢。”
                    枚舉變量提供這種檢查,什么意思?枚舉變量會自己檢?當然不是,作者也許想說程序員自己可以寫個程序檢查付給枚舉變量的值是否為該枚舉的有效值。
            /* 包含頭文件 */ 
            #include 
            <stdio.h>

            /* 枚舉類型 */
            enum months{JAN = 1, FEB};

            /* 函數原型 */
            void enumeration(enum months m);

            main()
            {
                
            enum months a = 2; 
                
            enum months b = 50;        /* C中不需要強制轉換為enum months類型 */

                enum months c = JAN;

                enumeration(a);
                enumeration(b);

                
            return 0;
            }

            /* enumeration函數:檢測枚舉變量存儲的值是否為該枚舉的有效值 */
            void enumeration(enum months m)
            {
                
            switch (m)
                {
                
            case JAN:
                    printf(
            "JAN: %d\n", JAN);
                    
            break;

                
            case FEB:
                    printf(
            "FEB: %d\n", FEB);
                    
            break;

                
            default:
                    printf(
            "%d不是該枚舉的有效值!\n", m);
                    
            break;
                }
            }


            而這段代碼如果改為C++源文件編譯,卻不能通過。原因如下:

            根據C標準的規定,枚舉常量的類型為int,枚舉變量的類型應該與char、有符號或無符號整型兼容。因此,枚舉變量可以接受 char、有符號或無符號整型數,而不限于僅從此枚舉類型所定義的枚舉常量中取值。由于上述原因,在C語言中無法從語法上保證枚舉變量只能在定義的枚舉成員中取值,只能由程序員自身保證不使用除枚舉成員之外的值。

            關于這一點,很多介紹C語言的書上或者資料上的描述是不正確的,應該加以注意。

            但是,如果給枚舉變量賦枚舉成員之外的值,有的編譯器可能會對此產生警告,有的則不會。因為這種行為不違反C標準的規定,編譯器對此如何反應都是有道理的。

            然而對于C++來說,編譯器會禁止給枚舉變量賦予枚舉成員之外的值。這是因為C++是一種強類型語言,枚舉類型不等同于 int 等其它類型。雖然枚舉類型可以隱式轉化為 int 等類型,但是 int 等類型卻不能自動轉化為枚舉類型,除非使用強制類型轉化。因此,如果不使用強制類型轉化的話,給枚舉變量賦值則只能從枚舉成員中選擇。對于枚舉類型要避免使用強制類型轉換。原因如下:
             
            The   C++   Programming   Language上說:   
            如果某個枚舉中所有枚舉值非負,枚舉的表示范圍為[0 : 2^k-1];其中2^K是使所有枚舉成員位于此范圍內的最小的2的冪;如果是負的,就是[-2^k : 2^k-1]。 因此對一個給定的整數值,如果使用強制類型轉換,而其值又不在枚舉的表示范圍以內,其行為是未定義的。

            // 包含頭文件  
            #include <iostream.h>

            int main()
            {
                
            enum months{JAN = 1, FEB, MAR};

                
            //enum months a = 1;              //cannot convert from 'const int' to 'enum main::months'
                enum months a = (enum months)1;
                cout 
            << "a: " << a << endl;    //輸出: a: 1

                
            enum months b = (enum months)10;
                cout 
            << "b: " << b << endl;    //輸出: b: 10 雖然輸出10,但結果是未定義的,因為此枚舉的表示范圍為:0~3

                
            return 0;
            }
            posted on 2008-07-29 15:35 小烏龜 閱讀(2831) 評論(2)  編輯 收藏 引用 所屬分類: C&C++

            評論

            # 小烏龜 2010-03-30 12:53 王繼晨
            這種辦法不錯  回復  更多評論
              

            # re: C/C++中的枚舉 2010-03-30 12:56 王繼晨
            ( 提交失敗后,可以通過“恢復上次提交”恢復剛剛提交的內容)  回復  更多評論
              

            久久亚洲欧美国产精品| 国内精品久久久久影院网站| 青草久久久国产线免观| 国内精品伊人久久久久影院对白| 国产99久久九九精品无码| 色综合久久中文字幕综合网| 久久99热这里只有精品国产| 无码人妻精品一区二区三区久久久| 国产精品久久久久久久久免费| 99久久免费只有精品国产| 中文字幕无码久久人妻| 久久国产精品99精品国产| 国产成人无码精品久久久免费 | 日批日出水久久亚洲精品tv| 久久精品毛片免费观看| 丰满少妇人妻久久久久久4| 久久精品一区二区三区AV| 久久99精品国产| 久久午夜羞羞影院免费观看| 久久精品不卡| 一本大道久久a久久精品综合| 久久亚洲AV无码精品色午夜| 亚洲精品高清国产一久久| 久久精品久久久久观看99水蜜桃| 99久久综合国产精品二区| 亚洲va久久久噜噜噜久久狠狠| 久久精品18| 久久久久无码国产精品不卡| 99久久精品国产一区二区蜜芽| 99久久综合狠狠综合久久止| 色欲综合久久中文字幕网| 99久久这里只精品国产免费| 久久九九免费高清视频| 国产91久久综合| 精品欧美一区二区三区久久久| 国产一级持黄大片99久久| 久久超碰97人人做人人爱| 久久99精品国产麻豆| 99久久er这里只有精品18| 久久久女人与动物群交毛片 | 青青青国产精品国产精品久久久久 |