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

            no_rain

            C中的Comma Operator和typedef,sizeof

            逗號運算符(Comma Operator)也是一種雙目運算符,它的形式是表達式1, 表達式2,兩個表達式不要求類型一致,左邊的表達式1先求值,求完了直接把值丟掉,再求右邊表達式2的值作為整個表達式的值。
            注意,函數(shù)調(diào)用時各實參之間也是用逗號隔開,這種逗號是分隔符而不是逗號運算符。但可以這樣使用逗號運算符:
            f(a, (t=3, t+2), c)
            sizeof是一個很特殊的運算符,它有兩種形式:“sizeof 表達式”和“sizeof(類型名)”。這個運算符很特殊,“sizeof 表達式”中的子表達式并不求值,而只是根據(jù)類型轉(zhuǎn)換規(guī)則求得子表達式的類型,然后把這種類型所占的字節(jié)數(shù)作為整個表達式的值。有些人喜歡寫成“sizeof(表達式)”的形式也可以。
            sizeof運算符的結(jié)果是size_t類型的,這個類型定義在stddef.h頭文件中,不過你的代碼中只要不出現(xiàn)size_t這個類型名就不用包含這個頭文件,比如像上面的例子就不用包含這個頭文件。C標準規(guī)定size_t是一種無符號整型,編譯器可以用typedef做一個類型聲明,
            那么size_t就代表unsigned long型。不同平臺的編譯器可能會根據(jù)自己平臺的具體情況定義size_t所代表的類型,比如有的平臺定義為unsigned long型,有的平臺定義為unsigned long long型,C標準規(guī)定size_t這個名字就是為了隱藏這些細節(jié),使代碼具有可移植性。

               typedef用來聲明一個別名,typedef后面的語法,是一個聲明。本來筆者以為這里不會產(chǎn)生什么誤解的,但結(jié)果卻出乎意料,產(chǎn)生誤解的人不在少數(shù)。罪魁禍首又是那些害人的教材。在這些教材中介紹typedef的時候通常會寫出如下形式: typedef int PARA; 這種形式跟#define int PARA幾乎一樣,這些教材的宗旨是由淺入深,但實際做出來的行為卻是以偏蓋全。的確,這種形式在所有形式中是最簡單的,但卻沒有對 typedef進一步解釋,使得不少人用#define的思維來看待typedef,把int與PARA分開來看,int是一部分,PARA是另一部分,但實際上根本就不是這么一回事。int與PARA是一個整體!就象int i:聲明一樣是一個整體聲明,只不過int i定義了一個變量,而typedef定義了一個別名。這些人由于持有這種錯誤的觀念,就會無法理解如下一些聲明: typedef int a[10]; typedef void (*p)(void); 他們會以為a[10]是int的別名,(*p)(void)是void的別名,但這樣的別名看起來又似乎不是合法的名字,于是陷入困惑之中。實際上,上面的語句把a聲明為具有10個int元素的數(shù)組的類型別名,p是一種函數(shù)指針的類型別名。 雖然在功能上,typedef可以看作一個跟int PARA分離的動作,但語法上typedef屬于存儲類聲明說明符,因此嚴格來說,typedef int PARA整個是一個完整的聲明。 定義一個函數(shù)指針類型。 比如原函數(shù)是 void func(void); 那么定義的函數(shù)指針類型就是typedef void (*Fun)(void); 然后用此類型生成一個指向函數(shù)的指針: Fun func1; 當func1獲取函數(shù)地址之后,那么你就可以向調(diào)用原函數(shù)那樣來使用這個函數(shù)指針: func1(void);
            下面舉幾個例子:

            typedef struct tagMyStruct

             
            int iNum;
             
            long lLength;
            } MyStruct;
            下一個

            typedef struct tagNode
            {
             
            char *pItem;
             pNode pNext;
            *pNode;
            編譯錯誤,
            C語言當然允許在結(jié)構(gòu)中包含指向它自己的指針,我們可以在建立鏈表等數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)上看到無數(shù)這樣的例子,上述代碼的根本問題在于typedef的應(yīng)用。正確的:

            typedef struct tagNode 
            {
             
            char *pItem;
             
            struct tagNode *pNext;
            *pNode;




            posted on 2011-11-14 14:12 is-programmer 閱讀(322) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            導(dǎo)航

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            統(tǒng)計

            常用鏈接

            留言簿

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲AV日韩AV永久无码久久| 欧美熟妇另类久久久久久不卡| 免费国产99久久久香蕉| 99久久夜色精品国产网站| 久久亚洲AV永久无码精品| 亚洲国产欧洲综合997久久| 香蕉久久一区二区不卡无毒影院| 天堂无码久久综合东京热| 成人免费网站久久久| 久久久久久久久久久| 久久久艹| 国产精品美女久久久久AV福利 | 一极黄色视频久久网站| 久久精品水蜜桃av综合天堂| 久久精品国产99久久丝袜| 久久精品水蜜桃av综合天堂| 亚洲精品WWW久久久久久| 久久99毛片免费观看不卡| 亚洲精品无码久久久久去q | 九九精品99久久久香蕉| 无夜精品久久久久久| 久久国产视屏| Xx性欧美肥妇精品久久久久久| 99精品国产99久久久久久97 | 久久人人爽人人爽人人AV东京热| 久久精品无码专区免费| 亚洲伊人久久大香线蕉苏妲己| 亚洲成色WWW久久网站| 国产精品久久久久久久久软件 | 精品人妻伦九区久久AAA片69| 国产精品欧美亚洲韩国日本久久| 国产精品一区二区久久不卡| 久久人爽人人爽人人片AV| 久久夜色精品国产噜噜噜亚洲AV | 精品久久一区二区| 久久777国产线看观看精品| 狠狠久久亚洲欧美专区| 久久免费小视频| 国产精品99久久久久久猫咪| 精品视频久久久久| 少妇久久久久久被弄到高潮|