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