web-dev-qa-db-ja.com

sizeofの後に括弧を使用する必要があるのはなぜですか?

以下はコンパイルに失敗します:

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

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

しかし、私がそれを

sizeof(arr);

すべて順調。どうして?

77
blueshift

6.5.3によると、sizeofには次の2つの形式があります。

sizeof unary-expression
sizeof ( type-name )

あなたのコードのarrtype-name、かっこで囲む必要があります。

111
Ise Wisteria

これが言語の指定方法です。ここでは型名を括弧で囲む必要があります。

文法が次のようになっているとします。

_sizeof unary-expression_ _sizeof type-name_

今、例えば次の式はあいまいです。

_sizeof int * + 0
_

sizeof(int *) + 0またはsizeof(int) * +0のいずれかです。式に追加されたアスタリスクは式ではないため(ただし、一部の型名では、追加された型名も型名です)、このあいまいさは単項式では発生しません。

ここで何かを指定する必要があり、型名を括弧で囲む必要があることは、あいまいさを解決する方法です。

40
mafso