C语言事实上不简单:sizeof
問:C語言中一共同擁有多少個(gè)keyword?
答:32個(gè)。
答不上來的沒關(guān)系。非常正常。我們玩的是程序的藝術(shù)。而不是背數(shù)字。
只是這個(gè)特殊的數(shù)字1<<5也是非常好記的-.-。
問:sizeof是函數(shù)還是keyword?
第一次看到這個(gè)問題,你可能會(huì)認(rèn)為有點(diǎn)莫名其妙,sizeof當(dāng)然是函數(shù)了,由于sizeof后面都跟了個(gè)括號(hào),這顯然是函數(shù)的象征。
可是既然我這么問了。你可能也猜到了,sizeof不是個(gè)函數(shù),它是個(gè)keyword!長(zhǎng)期以來由于sizeof的"標(biāo)準(zhǔn)使用方法",導(dǎo)致sizeof極easy被理解為一個(gè)函數(shù)。
嘗試執(zhí)行以下的代碼:
#include <stdio.h>int main() {int num = 5;printf("%d\n", sizeof(num));printf("%d\n", sizeof(int));printf("%d\n", sizeof num);getchar();return 0; }sizeof num竟然也能正確輸出4,可見它真的不是函數(shù)。只是sizeof int就是錯(cuò)誤的了。它會(huì)產(chǎn)生例如以下錯(cuò)誤:
error: expected primary-expression before "int"由于int前面僅僅能跟auto、unsigned等,況且sizeof int要怎么來理解?是想計(jì)算大小呢?還是想表示"sizeof"類型的int變量呢。查閱相關(guān)文檔后總結(jié)例如以下:
當(dāng)要計(jì)算變量的大小,比如基本類型(int、double)的變量,結(jié)構(gòu)體變量(實(shí)例)時(shí)。能夠不用括號(hào)。
當(dāng)要計(jì)算一個(gè)類型時(shí),不能省略括號(hào)。
無論什么場(chǎng)合都加上個(gè)括號(hào),一是統(tǒng)一,而是能使程序可讀性更強(qiáng)。且不易出錯(cuò)。我的目的并非為了省略這個(gè)括號(hào),省略了并不會(huì)讓事情變得更好。我所想要表達(dá)的是sizeof的還有一方面:由于如今我們知道了sizeof不是函數(shù)而是keyword,所以其本質(zhì)也就全然不同了。函數(shù)是在執(zhí)行時(shí)確定的,而keyword是在編譯時(shí)確定的。差別的話。嘗試執(zhí)行例如以下程序:
#include <stdio.h>int main() {int cc[10];printf("%d\n", sizeof cc[999999999]);getchar();return 0; }上面的程序并不會(huì)出錯(cuò)。而是正確輸出了4。
并非由于sizeof真的去找相對(duì)于cc首地址偏移999999999個(gè)位置的那個(gè)內(nèi)存,正如上文所述。sizeof在編譯時(shí)確定。所以它依據(jù)cc[X]的類型來確定大小。由于sizeof沒有去訪問這些地址,所以上面程序語法上沒有不論什么問題,僅僅只是邏輯上來說好像沒什么實(shí)際意義。你能不能想到一個(gè)能證明sizeof真的沒去"執(zhí)行"括號(hào)中的東西呢?事實(shí)上挺簡(jiǎn)單,試試執(zhí)行例如以下代碼:
printf("%d\n", sizeof(printf("hactrox")));其結(jié)果為4,并且"hactrox并沒有被輸出!沒被輸出說明sizeof真的沒有去調(diào)用括號(hào)中的東西。可是為什么是4呢?由于sizeof是依據(jù)類型來確定的,對(duì)于printf或者是函數(shù),sizeof以其返回值類型來確定。由于printf返回輸出字符的數(shù)量。這個(gè)數(shù)量是int類型的,所以就相當(dāng)于sizeof(int),所以是4。可能你還不知道printf的這個(gè)特性。試試執(zhí)行下面代碼:
#include <stdio.h> int main() {int num = printf("hactrox\n");printf("%d\n", num);getchar();return 0; }一個(gè)更直接的樣例例如以下: #include <stdio.h>int fun() {printf("hactrox");return 5; }int main() {printf("%d\n", sizeof(fun())); // 函數(shù)沒有被運(yùn)行,依據(jù)其返回值類型從而輸出4getchar();return 0; }關(guān)于sizeof另一個(gè)須要注意的地方。試試在腦海中執(zhí)行以下的程序。得出一個(gè)結(jié)果以后再去執(zhí)行它:
#include <stdio.h>#define SIZE_OF_ARRAY (sizeof(array) / sizeof(array[0]))int main() {int array[] = {1, 2, 3, 4, 5};for(int d = -1; d < (SIZE_OF_ARRAY-1); d++)printf("%d\n", array[d+1]);printf("END\n");getchar();return 0; } 是不是跟你想的不太一樣?為什么數(shù)組一個(gè)都沒輸出?原因就在于sizeof返回的是unsigned int。當(dāng)int與unsigned int比較的時(shí)候,int是要轉(zhuǎn)成unsigned int的,當(dāng)int <0的時(shí)候,這樣的強(qiáng)制轉(zhuǎn)換自然也就悲劇了,其結(jié)果是MaxValue(unsigned int)-abs(int),那么當(dāng)d = -1的時(shí)候,自然就轉(zhuǎn)變成一個(gè)相當(dāng)巨大的數(shù)了,for循環(huán)當(dāng)然也就不運(yùn)行了。 #include <stdio.h>int main() {int a = -1;unsigned int b = 10000;if(a > b)printf("a > b\n");elseprintf("a < b\n");a = (unsigned int)a;printf("%u\n", a); // unsigned int要用%u輸出而不要習(xí)慣地寫成%dgetchar();return 0; }最后,由于剛才提到了unsigned int的最大值。C語言中想要輸出int或是unsigned int的最大值要怎么辦呢?有個(gè)簡(jiǎn)單的小技巧: #include <stdio.h>int main() {printf("Max value of unsigned int is: %u\n", ~(unsigned int)0); // 結(jié)果僅僅能用%u表示printf("Max value of int is: %d\n", ~(unsigned int)0 >>1); // 結(jié)果用%d, %u表示均可 getchar();return 0; }
轉(zhuǎn)載于:https://www.cnblogs.com/mfrbuaa/p/5420224.html
總結(jié)
以上是生活随笔為你收集整理的C语言事实上不简单:sizeof的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android学习笔记----Java中
- 下一篇: C#开发微信门户及应用(28)--微信“