以下はコンパイルに失敗します:
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%確信しています。sizeof
Cが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を追加すると再び型名になります)。
ここで何かを指定する必要があり、タイプ名を括弧で囲む必要があることは、あいまいさを解決する方法です。