2011-05-05 48 views
61

下面無法編譯:爲什麼(以及何時)需要在sizeof之後使用圓括號?

typedef int arr[10]; 
int main(void) { 
    return sizeof arr; 
} 

sizeof.c:3: error: expected expression before ‘arr’ 

,但如果我將其更改爲

sizeof(arr); 

一切都很好。爲什麼?

+0

的sizeof作爲操作者不會在ANSI-C – Grim 2011-05-05 08:44:45

+2

@Kostya可供選擇:我的K&R(C語言我的最早描述)的拷貝是很遠的地方,我現在無法檢查,但我確信它符合C99標準現在所用的「sizeof」基本上與110相同。 'sizeof'是可用,因爲之前下由ANSI於1989年 – pmg 2011-05-05 09:09:07

+2

對不起,是我不好標準化.. – Grim 2011-05-05 14:59:02

回答

99

據6.5.3,有對sizeof爲以下兩種形式:

sizeof unary-expression 
sizeof (type-name) 

因爲在你的代碼arrtype-name,它必須被括號。

+9

+1和,只是強化了'sizeof'是一個操作符:括號「同屬」類型,而不是運營商。 – pmg 2011-05-05 09:10:47

+0

@pmg: 感謝您的澄清!是的,正如您所提到的,該標準表示作爲運營商的sizeof'。 – 2011-05-05 09:19:45

+0

K&R的A7.4.8,適合像我這樣的後期運動。 – jtniehof 2011-05-05 14:04:16

31

這是被指定的語言方式,類型名稱必須在此處括號。

假設的語法是這樣的:

sizeof unary-expression sizeof type-name

現在,如下面的表達式將是不明確的:

sizeof int * + 0 

它可以是任一sizeof(int *) + 0sizeof(int) * +0或。一元表達式不會出現這種歧義,因爲附加到表達式的星號不是表達式(但對於某些類型名稱,附加一個,又是類型名稱)。

這在某種程度上可以在這裏指定,並要求類型的名字被加上括號,是解決不確定性的一種方式。

0

我想這是因爲你有typedef。如果你刪除它,它應該編譯。維基百科

實施例:

/* the following code fragment illustrates the use of sizeof  
* with variables and expressions (no parentheses needed), 
* and with type names (parentheses needed)  
*/ 
char c; 
printf("%zu,%zu\n", sizeof c, sizeof (int)); 
相關問題