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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言事实上不简单:sizeof

發(fā)布時(shí)間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言事实上不简单:sizeof 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問: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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。