CおよびC ++で式(int)+ 4 * 5が許可されるのはなぜですか?


86
(int) + 4*5;

なぜこれ(値を持つ型の追加)が可能ですか?(g ++とgccで試してみました。)

私はそれが意味をなさない(そして効果がない)ことを知っていますが、なぜこれが可能であるのか知りたいです。



45
cppinsightsコンパイラフロントエンドの観点からコードがどのように見えるかを理解するのに役立つと呼ばれる便利なツールがあります。また、オンラインバージョンもあり、について何が示されているかを確認できます(与えられた回答と同じ「括弧」)
NikitaKniazev19年

22
このステートメントは同等です+(int)+ 4*5;し、-(int)- 4*5;かつ-+-+-(int)-+-+- 4*5;少ない詩的;
chqrlie

16
どの部分があなたを困惑させますか?私が知っている限りでは、あなたはなぜあなたが記号を示さずに5を書くことが許されているのかと尋ねています。
カルステン

5
C ++は、CタイプのキャストがC ++では推奨されないことを警告するべきではありませんか?
リスター氏

回答:


141

+ここで単項+演算子ではなく、バイナリ加算演算子。ここでは追加は行われません。

また、構文(int)は型キャストに使用されます。

あなたはその声明を次のように読み直すことができます

(int) (+ 4) * 5;    

これは次のように解析されます

((int) (+ 4)) * (5);    

つまり、

  1. +整数定数値に単項演算子を適用します4
  2. にタイプキャスト int
  3. オペランドを掛ける 5

これは(int) (- 4) * (5);、単項演算子の使用法がよく知られているに似ています。

あなたの場合、単項+とキャストto-intは両方とも冗長です。


50
「型キャスト」ではなく「キャスト」。型キャストは俳優に起こることです。
キーストンプソン

8
(+ 4)オペランドを作成し+4ません。これは、オペランドに単項+を適用することを意味します4。これは、OPの場合は実際にはノーオペレーションですが、他の状況では整数の昇格または配列の減衰を引き起こす可能性があります。たとえば、char c = 0; sizeof +c == sizeof cおそらく誤りでsizeof +"a"あり、おそらく2ではありません。
chqrlie19年

7
「両方が重複している」 -全体のことは同じように、冗長である42;:-)
paxdiablo

11
型キャストという用語を使用しても問題はありません。私だけではないようです
ベン

14
@BenTypecastingは型キャストではありません。
ケネス

40

これはとして解釈され((int)(+4)) * 5ます。つまり、式+4(リテラルに適用される単項プラス演算子4)はint、Cスタイルのキャストで型にキャストされ、結果に5。が掛けられます。

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