日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sizeof 再遇

發布時間:2023/12/13 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的sizeof 再遇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。