[英]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.0
或12
?
因為2.0是double
類型的常量,所以表達式nData + 2.0
具有類型double
,根據C標准的6.3.1.8節中指定的“通常算術轉換”:
首先,如果任一操作數的相應實數類型是long double,則另一個操作數在不改變類型域的情況下被轉換為對應的實類型為long double的類型。
否則,如果任一操作數的相應實數類型為double,則將另一個操作數轉換為類型為domain的類型,其類型為對應的實數類型為double
因此sizeof
評估為double
的大小。
在nData = 2.0
和nData += 2.0
的情況下,每個表達式都具有int
類型,因為這是賦值左側的類型。 所以sizeof
評估為int
的大小。
此外,僅在編譯時評估sizeof
運算符的操作數的類型。 這意味着不會在運行時評估任何賦值或增量。 所以在你的第二個例子中, nData
在使用sizeof
的兩行之后仍然具有值10。 在運行時評估sizeof
的操作數的唯一時間是操作數是否是可變長度數組。
為什么
nData
不能是sizeof(nData += 2.0)
12.0
或12
?
那么, 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.0
是double
類型,來自章節§6.4.4.2
浮點常量具有有效位部分,后面可以跟一個指數部分和一個指定其類型的后綴。 有效數部分的分量可以包括表示整數部分的數字序列,后面是句點(。),后面是表示分數部分的數字序列。 [...]
和
未填充的浮點常量具有
double
類型。 [...]
因此,像2.0
這樣的常量值具有double
類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.