100

sizeofは任意のデータ型と式のサイズを計算するために使用される演算子であり、オペランドが式の場合、括弧は省略できます。

int main()
{
        int a;

        sizeof int;
        sizeof( int );
        sizeof a;
        sizeof( a );

        return 0;
}

の最初の使い方sizeofは間違っていますが、他の使い方は正しいです。

gcc を使用してコンパイルすると、次のエラー メッセージが表示されます。

main.c:5:9: error: expected expression before ‘int’

私の質問は、C 標準がこの種の操作を許可しない理由です。sizeof intあいまいさを引き起こしますか?

4

3 に答える 3

104

以下はあいまいになる可能性があります。

sizeof int * + 1

ですか(sizeof (int*)) + 1、それとも(sizeof(int)) * (+1)

明らかに、C 言語はあいまいさを解決するための規則を導入できたはずですが、なぜそれが問題にならなかったのかは想像できます。現状の言語では、型指定子が式に「そのまま」現れることはありません。そのため、その秒*が型の一部なのか算術演算子なのかを解決する規則は必要ありません。

既存の文法は、 の潜在的なあいまいさをすでに解決していますsizeof (int *) + 1。では(sizeof(int*))+1ありません sizeof((int*)(+1))

C++ には、関数スタイルのキャスト構文を使用して解決する、やや似た問題があります。あなたは書くことができint(0)、あなたは書くことができますが、あなたは書くtypedef int *intptr; intptr(0);ことができませんint*(0)。その場合の解決策は、「裸の」型は単純な型名でなければならず、スペースや末尾の句読点が含まれる可能性のある古い型 ID だけにすることはできません。おそらくsizeof同じ制限で定義された可能性がありますが、私にはわかりません。

于 2012-10-29T11:17:20.027 に答える
32

C99規格から

6.5.3.4.2演算子は、そのオペランドのサイズ (バイト単位) を生成します
sizeofこれは、式または括弧で囲まれた型の名前である場合があります。

あなたの場合int、式でも括弧で囲まれた名前でもありません。

于 2012-10-29T12:53:45.437 に答える
6

C で sizeof 演算子を使用する方法は 2 つあります。構文は次のとおりです。

C11 6.5.3 Unary operators
...
sizeof unary-expression
sizeof ( type-name )

型をオペランドとして使用する場合は常に、言語の構文定義により、括弧が必要です。式で sizeof を使用する場合、括弧は必要ありません。

C 標準では、式のどこで使用するかについて、そのような例が 1 つ示されています。

sizeof array / sizeof array[0]

ただし、一貫性を保つため、および演算子の優先順位に関連するバグを回避するために、状況に関係なく常に () を使用することを個人的にお勧めします。

于 2012-10-29T14:24:09.333 に答える