フォームのステートメントをコーディングする必要がありました
a = a || expr;
whereを評価し、結果をiffexpr
に代入するが設定されていません。これは、論理 OR の短絡機能に依存しています。a
a
上記を短く書くと、もちろん、
a ||= expr;
しかし (驚いたことに) C には論理代入演算子がありません。
だから私の質問は2つあります。まず、標準 C で最初のステートメントを書くためのより短い方法はありますか (三項演算子はさらに悪いです - 3 回a = a ? a : expr
スペルアウトする必要がありますa
)。
次に、C に論理代入がないのはなぜですか? 私が考えることができる考えられる理由は次のとおりです。
- 文法の解析が難しくなりますか?
- これらの場合の短絡の処理には微妙な点がありますか?
- それは不必要だと考えられていました (しかし、それはすべての演算子割り当てに対する議論ではありませんか?)
編集
この質問のロックを解除してください:
それがリンクされている質問(の複製とされるものとして)は、まだ回答されていません。その質問に対する(受け入れられた)回答
||=
は、の機能を複製するため存在しないと述べてい|=
ます。それは間違った答えです。|=
短絡しません。C と C++ は同じ言語ではありません。なぜCにそれがないのか知りたいです。実際、C++ のような派生言語、特に Java (Edmund の回答で示唆されているようなレガシー コードの問題に悩まされていない) は、この問題をさらに興味深いものにしています。
編集2
本来の意図が間違っていたようです。ステートメントa = a || expr
( wherea
は整数でありexpr
、整数値を返します。最初にa
との両方expr
が暗黙的に「ブール値」に変換され、次に「ブール値」が に割り当てられa
ます。これは正しくありません — 整数値は失われます。ありがとうございます。 、イェンス、エドマンド。
したがって、質問の最初の部分では、代替手段ではなく:)、私の意図をコーディングするための正しい方法は次のようになります。
if (!a) a = expr;
また
a = a ? a : expr;
それらは同じように最適化する必要があります(私は思います)が、個人的には最初のものを好みます(a
入力するものが1つ少ないため)。
ただし、質問の2番目の部分はまだ残っています。Jens と Edmund が のあいまいさについて示した議論は、a ||= expr
にも同様に当てはまりますa = a || expr
。代入ケースは、単純に通常のケースとして扱うことができます。
a
ブール値に変換- true の場合、式全体の値はのブール値と等しくなります。
a
- それ以外の場合は を評価し
expr
、結果をブール値に変換し、 に代入しa
て返します
上記の手順は、割り当てと通常のケースの両方で同じようです。