據(jù)類型的長度)
1.sizeof操作符sizeof是一個關(guān)鍵字專門用來計算sizeof的操作數(shù)的類型長度的存儲的數(shù)據(jù)范圍就有所差異。sizeof操作符的操作數(shù)可以是類型也可是變量或者表達式。sizeof(類型) sizeof 表達式注意sizeof的操作數(shù)如果不是類型是表達式的時候可以省略后邊的括號如上圖所示sizeof 運算符的返回值C語?只規(guī)定是無符號整數(shù)并沒有規(guī)定具體的類型而是留給系統(tǒng)自己去決定 sizeof 到底返回什么類型。不同的系統(tǒng)中返回值的類型有可能是unsigned int 也有可能是 unsigned long 甚?是 unsigned long long 對應(yīng)的 printf() 占位符分別是 %u 、 %lu 和 %llu 。這樣不利于程序的可移植性。因此C語言提供了?個解決方法創(chuàng)造了?個類型別名 size_t 用來統(tǒng)?表示sizeof 的返回值類型。對應(yīng)當前系統(tǒng)的 sizeof 的返回值類型可能是 unsigned int 也可能是 unsigned long long 。2.數(shù)據(jù)類型長度//sizeof計算的結(jié)果是size_t類型的size_t類型的數(shù)據(jù)打印使用%zu #include stdio.h int main() { printf(zu\n,sizeof(char)); printf(zu\n,sizeof(_Bool)); printf(zu\n,sizeof(short)); printf(zu\n,sizeof(int)); printf(zu\n,sizeof(long)); printf(zu\n,sizeof(long long)); printf(zu\n,sizeof(float)); printf(zu\n,sizeof(double)); printf(zu\n,sizeof(long double)); return 0; }所計算出的結(jié)果分別是112448488單位為字節(jié)。那么這時候便可能會有一個疑問字節(jié)到底是什么呢首先假設(shè)我們在計算機中想要存儲一個二進制位當然我們知道計算機能理解的是二進制二進制中經(jīng)常有1或者是0那么想把1存儲起來需要一塊空間同理想把0存儲起來也需要一塊空間那么存1或者0的這樣一個空間的大小就叫做1bit位一個bit位就可以存一個二進制位那么8個bit位放在一起這樣的一個空間就叫做一個字節(jié)也是char和bool的長度。那么此時又有一個問題long是長整型為什么字節(jié)數(shù)與int整形的字節(jié)數(shù)相同呢在c語言標準中規(guī)定sizeof(long)sizeof(int)但long的長度沒有具體的規(guī)定有時候是4有時候是8在不同的環(huán)境中字節(jié)數(shù)不一定相同。同時sizeof(long double)sizeof(double)。3.sizeof中表達式不計算舉一個例子此時最關(guān)鍵的一個點是sizeof中的表達式是不計算的。那么此時我們可以假設(shè)s被賦值如果賦值成功那么s就變成了7但是當我們打印s的時候會發(fā)現(xiàn)s的值還是10所以527賦值給s這個表達式并沒有計算所以可以得出sizeof里面放的表達式是不會真實計算的。如果是這樣那么可能會想問既然不會真實計算那么sizeof如何計算長度呢其實是通過類型來推導(dǎo)的。那么是怎么推導(dǎo)出2的呢a是int類型的且2也是int類型的如果要計算的話那就是兩個int相加的結(jié)果也是int類型的而現(xiàn)在要把算出的結(jié)果賦給s且s是short類型的現(xiàn)在我們要將int的結(jié)果放入s中所以這個表達式的結(jié)果是s說了算而最終的結(jié)果是取決于s的類型且s是short類型所以求出長度是2。