簡體   English   中英

sizeof運算符的操作數

[英]operands for sizeof operator

我明白了結果

int nData = 10;
printf("%d", sizeof(nData + 2.0));

是“8”

為什么每個結果

int nData = 10;
printf("%d", sizeof(nData = 2.0));
printf("%d", sizeof(nData += 2.0));

不是8而是4? 為什么nData不能是sizeof(nData += 2.0) 12.012

因為2.0是double類型的常量,所以表達式nData + 2.0具有類型double ,根據C標准的6.3.1.8節中指定的“通常算術轉換”:

首先,如果任一操作數的相應實數類型是long double,則另一個操作數在不改變類型域的情況下被轉換為對應的實類型為long double的類型。

否則,如果任一操作數的相應實數類型為double,則將另一個操作數轉換為類型為domain的類型,其類型為對應的實數類型為double

因此sizeof評估為double的大小。

nData = 2.0nData += 2.0的情況下,每個表達式都具有int類型,因為這是賦值左側的類型。 所以sizeof評估為int的大小。

此外,僅在編譯時評估sizeof運算符的操作數的類型。 這意味着不會在運行時評估任何賦值或增量。 所以在你的第二個例子中, nData在使用sizeof的兩行之后仍然具有值10。 在運行時評估sizeof的操作數的唯一時間是操作數是否是可變長度數組。

為什么nData不能是sizeof(nData += 2.0) 12.012

那么, sizeof是一個編譯器時間操作符 ,它對數據類型而不是值進行操作。

換句話說,除非參數是VLA ,否則不會計算sizeof的操作數。

引用C11 ,章節§6.5.3.4

sizeof運算符產生其操作數的大小(以字節為單位),該操作數可以是表達式或類型的帶括號的名稱。 大小由操作數的類型確定。 如果操作數的類型是可變長度數組類型,則計算操作數; 否則,不評估操作數,結果是整數常量。

所以,在你的情況下,

  printf("%d", sizeof(nData + 2.0));   // data == int, 2.0 == double

是相同的

 printf("%d", sizeof(double));  //  as the resulting "type" of the addition, 
                                //   'int + double' would be  'double'

哪個應該更好

 printf("%zu", sizeof(double));   //not %d

sizeof產生size_t類型。

另外,關於2.0double類型,來自章節§6.4.4.2

浮點常量具有有效位部分,后面可以跟一個指數部分和一個指定其類型的后綴。 有效數部分的分量可以包括表示整數部分的數字序列,后面是句點(。),后面是表示分數部分的數字序列。 [...]

未填充的浮點常量具有double類型。 [...]

因此,像2.0這樣的常量值具有double類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM