私が調べたほとんどすべてのC/C ++演算子の優先順位表には、代入演算子よりも優先順位が高いものとして3値条件演算子がリストされています。ただし、ウィキペディアにあるテーブルや、operator-precedence.comにあるテーブルなど、同じ優先順位レベルに配置されるテーブルがいくつかあります。それはどちらですか、それより高いですか、それとも同じですか?
3 に答える
C ++文法では、
代入式:
条件式
論理または式の代入演算子初期化子句
スロー式
条件式:
論理または式
論理または式?式:代入式
イニシャライザ句:
代入式
braced-init-list
に組み合わせることができます
代入式:
論理または式
論理または式?式:代入式
論理または式の代入演算子の代入式
論理または式の代入演算子初期化子句
スロー式
とだけを見て=、と?:の間の内部式を無視する?と:、これは明らかに?:、=まったく同じ優先順位を与えます。
?:これは、の左オペランドも右オペランドも最上位演算子として代入演算子を持つことができないC文法とは異なります。
代入式:
条件式
単項式代入-演算子代入式
条件式:
論理OR式
論理OR式?式:条件式
したがって、Cの場合、異なる優先順位レベルを与えることは理にかなっています。
とは言うものの、優先順位レベルは標準が実際に言っていることの概算にすぎず、選択した優先順位レベルが誤解を招く、または単に間違っていることを示す場合があります。あなたの解釈に応じて、の内面の表現は?:それらの1つかもしれません、それは私のためです。
C ++の答えはそれ?:で=あり、同じ優先順位を持っています。はい、ほとんどすべてのC++演算子の優先順位テーブルが間違っています。
Cでは、演算子がl値に評価することは許可されていないため、?:より大きいかどうかは関係ありません。これは、優先順位が動作に影響を与える場合に実行する必要があることです(すでにRTLアソシアティブ)。たとえば、LuchianCrigoreの回答の説明を参照してください。=?:
初期のC++演算子の優先順位テーブルがCテーブルからコピーおよび拡張された可能性があるため、このエラーは非常に広範囲に及ぶ可能性があります。そしておそらく、唯一の反例であるフォームの表現a?b:c=dがめったに使用されないため、エラーが続いています。多分。
あなたはそれを標準で見つけるでしょう:
5つの式[expr]
58)演算子の優先順位は直接指定されていませんが、構文から導出できます。(ノート)
これは、優先順位テーブルが推測され、指定されていないことを意味します。それらが同じように動作する限り、両方とも正しいと言えます。したがって、優先順位テーブルがそれらを同じ優先順位を持つものとして配置したり、代入演算子の上に3項を配置したりしても、構文上、実際には同じことが起こります。
ここでは、結合性がより大きな役割を果たしていることに注意してください(これも構文から派生しています)。
それらが同じ優先順位を持っていると仮定しても:
a = b ? c : d;
a = (b ? c : d)どちらも右から左への結合であるため、として扱われます。