2016-07-29 113 views
1

我期望的是,
1.類型輸入。
2.讀取輸入並返回輸入值。
3.評估值的大小。
4.打印sizeof值。爲什麼sizeof按預期工作?

但是第一步從未發生。

爲什麼不第一步發生?

+0

我得到這個:[ICS @蒸汽男孩ics_client] $ gcc的-o臨時temp.c [ICS @蒸汽男孩ics_client] $ ./temp 4 [ICS @蒸汽男孩ics_client] $什麼平臺是你嗎? – octopusgrabbus

+1

你也應該在你的格式化字符串的末尾添加一個'\ n'。 –

回答

4

sizeof()函數不會評估括號中的內容:它會查看類型並返回大小。這是絕對安全:

char *ptr = NULL; // NULL ponter! 
printf("%d", sizeof(*ptr)); 

它將返回1,因爲它不必計算表達式就知道答案了。

+1

「這非常安全:」 - >不是真的。 sizeof'的結果類型是'size_t'。匹配的'printf()'說明符是'「%zu」',而不是'「%d」'。 – chux

1

因爲getchar()返回類型是int而不是charsizeof(int)在您的平臺上是4。

此外,您應該使用%zu來打印size_t值。使用不正確的格式說明符在技術上是undefined behaviour

2

我期望的是,1.類型輸入。 2.讀取輸入並返回輸入值。 3.評估sizeof值4.打印sizeof值。

但是第一步從未發生。爲什麼不邁出第一步?

因爲除極少數例外情況,sizeof運算符不會評估其操作數。您的使用情況不是例外情況之一。未評估getchar()表示getchar()未被調用。

無論如何,我不確定你期望從你的代碼中得到什麼。即使調用getchar(),結果總是具有相同的類型(int),它不依賴於輸入。

也請關注@P.P.的評論。您的printf()格式與正在打印的數據類型不匹配,size_t。正如他所觀察到的,printf()調用的結果是未定義的行爲。

1

在C中,sizeof運算符僅在運行時對可變大小數組(VLA)進行評估。在所有其他情況下,操作員不會評估操作數。它推導出表達式的類型並返回推導類型的對象的大小。

相關問題