このように定義すると、どちら++x++
も実行できません++x--
。一方、(++x)++
とはどちら(++x)--
も便利な式です。は 2(++x)++
ずつインクリメントx
し、「中間」の値を返します。 while(++x)--
は と本質的に同等ですが、x+1
を呼び出す必要が完全に回避されますoperator+
。これは場合によっては非常に便利です。
では、優先順位がではなくに++x++
自動的に展開されるように定義されていないのはなぜですか? 後者には私が理解できない隠された意味がありますか、それとも単一のレベルを構成するすべてのプレフィックス演算子を含む単純なリストの優先順位を維持するためですか?(++x)++
++(x++)
編集OK、明示的には言いませんでしたが、もちろん、x
ユーザー定義型になるつもりでした。組み込み型の場合、(x+=2)-1
はもちろん よりも優れており、(++x)++
よりもはるかに優れています。私が念頭に置いている状況は、かなり複雑なタイプの半連想コンテナーへのイテレーターであり、オペレーターと(ランダムアクセス用に設計されている) は、一般的な要求に対して効率的に機能するためにキャッシュを再構築する必要があり、したがって命令です。よりも遅い大きさです。もちろん、引数が非常に小さい整数であるかどうかを常に最初に確認するように変更できます。その場合は、単に呼び出しますx+1
(++x)--
+=
+
++
operator++
ランダムアクセス手順を実行する代わりに、繰り返し。operator+=
ここでは問題なく機能するはずですが、提示する数値がどれほど小さいかに関係なく、ある時点で常にランダムアクセスの方法を使用したい状況が発生する可能性があると想像できます.
だから...私にとって、私は答えを次のように結論付けます:
すべての後置演算子が前置演算子の前に来る、単純で覚えやすい優先順位リストを持つ利点は、前置演算子と後置演算子/を構成するために常に括弧を使用しなければならないという小さな欠点を許容するのに十分です。めったに使用されません。
++
--
より単純な「C はこのように行う」というのは、本当の理由のように思われますが、私には満足のいくものではありません。なぜなら、 C ではまったく++x++
許可されていなかったので、この構成そのものを再定義することができたからです。既存のコード。
とにかく、(++x)--
かっこはそれほど痛くないので、引き続き使用します。