簡體   English   中英

為什么sizeof int是錯誤的,而sizeof(int)是對的?

[英]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可以用相同的限制來定義,我不確定。

C99標准

6.5.3.4.2
sizeof運算符產生其操作數的大小(以字節為單位),該操作數可以是表達式或類型的帶括號的名稱。

在你的情況下, int既不是表達式也不是帶括號的名稱。

有兩種方法可以在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.

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