下面無法編譯:爲什麼(以及何時)需要在sizeof之後使用圓括號?
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
,但如果我將其更改爲
sizeof(arr);
一切都很好。爲什麼?
下面無法編譯:爲什麼(以及何時)需要在sizeof之後使用圓括號?
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
,但如果我將其更改爲
sizeof(arr);
一切都很好。爲什麼?
這是被指定的語言方式,類型名稱必須在此處括號。
假設的語法是這樣的:
sizeof unary-expression
sizeof type-name
現在,如下面的表達式將是不明確的:
sizeof int * + 0
它可以是任一sizeof(int *) + 0
sizeof(int) * +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));
的sizeof作爲操作者不會在ANSI-C – Grim 2011-05-05 08:44:45
@Kostya可供選擇:我的K&R(C語言我的最早描述)的拷貝是很遠的地方,我現在無法檢查,但我確信它符合C99標準現在所用的「sizeof」基本上與110相同。 'sizeof'是可用,因爲之前下由ANSI於1989年 – pmg 2011-05-05 09:09:07
對不起,是我不好標準化.. – Grim 2011-05-05 14:59:02