2013-05-07 48 views
8
#include <stdio.h> 
int main()   
{ 

      short int i = 20; 

      char c = 97; 

      printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i)); 
      return 0; 
} 

能有一個人告訴我發生什麼事時的sizeof(A + B) 「一短整型& b爲char類型」 輸出爲:2,1,4這裏發生了什麼?的sizeof(short_int_variable + char_variable)

+0

'的sizeof '是一個編譯時構造。 – 2013-05-07 10:00:12

+0

結果大小計算爲int – BLUEPIXY 2013-05-07 10:00:49

+0

您還沒有提到sizeof(c + c)也會給出4,所以sizeof(c/2)或sizeof(1998) – Kartikya 2013-05-07 10:27:20

回答

8

因爲C標準integral promotion rules的,表達c + i的類型是int,所以這就是爲什麼你得到相當於sizeof (int)

請注意,sizeof不是函數,僅在命名類型and to resolve precendence conflicts時才需要括號。您的代碼承擔責任:水災這樣寫:

printf("%zu, %zu, %zu\n", sizeof i, sizeof c, sizeof (c + i)); 

最終使用的sizeof有括號,因爲sizeof結合比+更緊,說sizeof c + i將被解析爲(sizeof c) + i這是不理想的結果。

還要注意,這是大部分時間的編譯時構造,表達式從來沒有實際評估過。所發生的只是編譯器「假裝」評估它,找出表達式的類型,然後給出這種類型值的大小。實際價值永遠不需要存在,有時是整潔的。

類型由sizeof返回的值是size_t,其上打印使用%zu(它不是int)。

+0

正如你在別處已經提到的,爲避免混淆,總是在'sizeof'和左括號之間加一個空格。 (我只是把這個機智的約定明確地寫給讀者) – Rerito 2013-05-07 10:16:58

+1

代碼應該是'printf(「%zu,%zu,%zu \ n」,sizeof i,sizeof c,sizeof(c + i));'因爲['sizeof'不返回'int'](https://stackoverflow.com/q/940087/995714) – 2017-12-04 03:08:52

+0

@LưuVĩnhPhúc絕對,謝謝你糾正這個舊的答案。當然,編輯。 – unwind 2017-12-04 08:47:39

0

sizeof只能在編譯時才能獲得表達式的大小。

以下不會實際增加 'C':

C =的sizeof(++ C);

表達式sizeof(A + B)將無符號具有優先返回最大型

4
1) sizeof(i) ==> sizeof(short int) = 2 

2) sizeof(c) ==> sizeof(char) = 1 

3) sizeof(c + i [97+20]) ==> sizeof(int) = 4 // result in constant value which is int as default 
+0

downvotter。請解釋我所明白的錯誤?我會糾正我.. – Mani 2013-05-07 10:05:54

+0

*「導致恆定值,這是默認爲int」* - 嗯?我甚至都不明白你在說什麼。 – 2013-05-07 10:41:38

+0

@ChristianRau我會談論'(c + i)',它會導致默認值爲int的常量值。 – Mani 2013-05-07 10:54:17

0

a的數據類型是「short int」。 -32768〜+32767

c的數據類型是「char」。 0〜255

當您添加到c它也不短整型也不焦炭,它成爲INT

這裏是一個示例代碼,幫助您獲得變量的數據類型:

#include <typeinfo> 

int main() 
{ 
    short int a = 1; 
    char c = 'A'; 
    std::cout << typeid(a + c).name() << std::endl; 

    return 1; 
} 
+0

「short」的範圍是-32768到32767. – Lindydancer 2013-05-07 10:09:10

+0

你是對的... 我犯了一個錯誤。 – 2013-05-07 10:17:12

1

正如其他人說,sizeof會計算在編譯時。

這裏,表述c + i整數的值,如C和I被促進(整數提升)爲int並且因此

sizeof(c + i) 

給你的32位機器上的4個字節..