sizeofの後に括弧を使用する必要があるのはなぜ(そしていつ)ですか?


80

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

しかし、私がそれをに変更した場合

すべて順調。どうして?


オペレーターとしてのsizeofは、ansi-cでは使用できません
Grim

2
@Kostya:私のK&Rのコピー(私が持っているC言語の最も古い記述)は非常に遠く、今は確認できませんが、sizeof基本的にC99Standardと同じように記述されていると110%確信しています。sizeofCが1989
。– pmg 2011

回答:


120

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

以来arr、あなたのコードでありtype-name、それは括弧する必要があります。


15
+1と、それsizeofが演算子であることを強調するために、括弧は演算子ではなく型に「属します」。
pmg 2011

@pmg:説明してくれてありがとう!はい、あなたが言ったように、標準はsizeof演算子として示します。
伊勢藤

4
@pmg:括弧が「何に属しているか」が明確ではないと思います。2番目の形式の構文は、3つのトークンと1つの非終端記号で構成されますsizeof ( type-name )。ただし、最初の形式の場合、たとえば、を記述できsizeof(x)ます。これは関数呼び出しのように見えますが(sizeofキーワードでない場合)、実際には括弧で囲まれた式に適用される演算子です。それはあなたが考えていたものですか?
キーストンプソン

3
つまりsizeof、構文的sizeof <SOMETHING>には、関数とは対照的に、たとえば、printfprintf ( <SOMETHING> )です。括弧はに属しますが、には属しprintfませんsizeofsizeofが括弧で囲まれた型名に適用される場合、私はそれを何のキャストとしても考えるのが好きです-型だけを「返す」。
pmg 2011

2
@pmg:確かにそのように考えることができますが、誤解を招くと思います。キャストとの唯一の本当の類似点は、括弧内に型名があることです。これは、構文上の利便性の偶然です。私sizeof ( type-name )はそれ自身の表現として考えることを好みます。(標準ではこれを演算子と呼んで( type-name )いますが、通常の意味では実際にはオペランドではありません。)
キーストンプソン

44

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

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

sizeof unary-expression sizeof type-name

たとえば、次の式はあいまいになります。

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

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


-3

持っているからだと思いますtypedef。削除するとコンパイルされます。

ウィキペディアの例:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.