以下はコンパイルに失敗します:
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
しかし、私がそれをに変更した場合
sizeof(arr);
すべて順調。どうして?
以下はコンパイルに失敗します:
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
しかし、私がそれをに変更した場合
sizeof(arr);
すべて順調。どうして?
sizeof基本的にC99Standardと同じように記述されていると110%確信しています。sizeofCが1989
回答:
6.5.3によるとsizeof、次の2つの形式があります。
sizeof unary-expression
sizeof ( type-name )
以来arr、あなたのコードでありtype-name、それは括弧する必要があります。
sizeofが演算子であることを強調するために、括弧は演算子ではなく型に「属します」。
sizeof演算子として示します。
sizeof ( type-name )。ただし、最初の形式の場合、たとえば、を記述できsizeof(x)ます。これは関数呼び出しのように見えますが(sizeofキーワードでない場合)、実際には括弧で囲まれた式に適用される演算子です。それはあなたが考えていたものですか?
sizeof、構文的sizeof <SOMETHING>には、関数とは対照的に、たとえば、printfはprintf ( <SOMETHING> )です。括弧はに属しますが、には属しprintfませんsizeof。sizeofが括弧で囲まれた型名に適用される場合、私はそれを何のキャストとしても考えるのが好きです-型だけを「返す」。
sizeof ( type-name )はそれ自身の表現として考えることを好みます。(標準ではこれを演算子と呼んで( type-name )いますが、通常の意味では実際にはオペランドではありません。)
これが言語の指定方法です。ここでは型名を括弧で囲む必要があります。
文法が次のようになっているとします。
sizeof unary-expression
sizeof type-name
たとえば、次の式はあいまいになります。
sizeof int * + 0
sizeof(int *) + 0またはのいずれかsizeof(int) * +0です。式に追加されたアスタリスクは式ではないため、このあいまいさは単項式では発生しません(ただし、一部の型名では、1を追加すると再び型名になります)。
ここで何かを指定する必要があり、タイプ名を括弧で囲む必要があることは、あいまいさを解決する方法です。