[英]Why sizeof int is wrong, while sizeof(int) is right?
我們知道sizeof
是一個用於計算任何數據類型和表達式大小的運算符,當操作數是表達式時,括號可以省略。
int main()
{
int a;
sizeof int;
sizeof( int );
sizeof a;
sizeof( a );
return 0;
}
sizeof
的第一次使用是錯誤的,而其他人是對的。
當使用gcc編譯時,將給出以下錯誤消息:
main.c:5:9: error: expected expression before ‘int’
我的問題是為什么C標准不允許這種操作。 sizeof int
會導致任何歧義嗎?
以下內容可能含糊不清:
sizeof int * + 1
是(sizeof (int*)) + 1
,還是(sizeof(int)) * (+1)
?
顯然,C語言可能已經引入了一個解決歧義的規則,但我可以想象為什么它沒有打擾。 使用當前的語言,類型說明符永遠不會在表達式中顯示為“裸”,因此不需要規則來解析第二個*
是類型的一部分還是算術運算符。
現有的語法已經解決了sizeof (int *) + 1
的潛在歧義。 它是(sizeof(int*))+1
, 而不是 sizeof((int*)(+1))
。
使用函數式轉換語法解決C ++時會遇到類似的問題。 你可以編寫int(0)
,你可以編寫typedef int *intptr; intptr(0);
typedef int *intptr; intptr(0);
,但你不能寫int*(0)
。 在這種情況下,解決方案是“裸”類型必須是一個簡單的類型名稱,它不能只是任何可能在其中有空格或尾隨標點符號的舊類型ID。 也許sizeof
可以用相同的限制來定義,我不確定。
有兩種方法可以在C中使用sizeof運算符。語法是這樣的:
C11 6.5.3 Unary operators
...
sizeof unary-expression
sizeof ( type-name )
無論何時使用類型作為操作數,都必須使用括號,語言的語法定義。 如果在表達式上使用sizeof,則不需要括號。
C標准給出了一個這樣的示例,表示您可能希望在表達式上使用它:
sizeof array / sizeof array[0]
但是,為了保持一致性,並避免與運算符優先級相關的錯誤,我個人建議不管情況如何總是使用()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.