sizeof 再遇
?
看下面程序片段:
#include <stdio.h>?int main(){ int a=255; printf("%d\n", sizeof(++a)); printf("%d\n", a);? return 0;}結果:
4
255
這個是我們已經熟知的:sizeof是編譯期求值,所以sizeof中表達式根本不計算,而是只需要知道此表達式的類型就可以得到值
再看:
#include <stdio.h>?char func(){ return 1;}?int main(){ printf("%d", sizeof(func()));? return 0;}結果:
1
這個也很顯然嘛,func()這個表達式的類型就是其返回值的類型,上述代碼中即char
#include <stdio.h>?void func(){}?int main(){ printf("%d", sizeof(func()));? return 0;}結果也是1
void 是C中特意加上的類型,如不指定具體類型,其大小當然就是1了。沒有這個類型之前,我們表示最小的類型只能用char了,但是char這個類型的本意是字符類型,如果實際上你要表示的不是字符,而僅僅因為其大小是1而使用char類型,勢必會引起混淆。這也是C為什么會新增一個void類型的原因了。
上面有個陷阱,咋一看,還以為sizeof去求值的是函數指針呢,其實是表達式的值。
再看我變成這樣:
#include <stdio.h>?char func(){ return 1;}?int main(){ printf("%d", sizeof(func));? return 0;}有人想,這下總該是理解成函數指針吧!那么你錯了,這次它的結果還是1。等會告訴你原因。
再改一下:
#include <stdio.h>?char func(){ return 1;}?int main(){ printf("%d", sizeof(&func));? return 0;}這次對了,終于順利打印出結果4. 這次是評估出是函數指針了
思考一下: 為什么會出現這兩個結果。C中不是規定,函數名和對函數名取地址都是函數指針類型嗎?
你沒錯,可是我也不知道為什么。呵呵,賣關子了
這可能是編譯期理解的問題了,因為這個時候本身就是會產生歧義的。gcc可能直接把函數名這個表達式認為表示函數,表達式的值也就是其返回類型了
這里做了個測試:
1. gcc編譯器會得到結果 sizeof(func) 為1
2. 而MS的編譯器卻直接認為是非法的sizeof操作,編譯通不過
?
所以不用過于糾纏語法上本身存在歧義的特殊情形。編譯期會做不同的解釋。
過些天查找下ISO C標準,看是否對這種情況有規定。
轉載于:https://www.cnblogs.com/chio/archive/2008/09/21/1295105.html
總結
- 上一篇: Web开发编程实用手册
- 下一篇: 20个方法让你摆脱坏习惯