タイトルの状態のように、整数 (または float などの任意の数値データ型) 比較演算子 (==、!=、>、>=、<、<=) は C++ で短絡されていますか?
4 に答える
彼らは短絡することはできません。、 などがそうx == y
であるかどうかを知るには、x と y の両方を評価する必要があります。短絡とは、論理ブール演算子andを指します。最初の引数が false の場合、論理 AND は false であることがわかり、最初の引数が true の場合、論理 OR は true であることがわかっています。このような場合、2 番目の引数を評価する必要はありません。これは短絡と呼ばれます。x != y
true
false
&&
||
編集:これは、オペランドが符号なし整数でゼロx >= y
の場合に短絡しない理由についての議論に従います:x
論理オペランドの場合、短絡は無料で実装中立です。のマシンコードif(f() && g()) stmt;
は次のようになります。
call f
test return value of f
jump to next on zero
call g
test return value of g
jump to next on zero
execute stmt
next: ...
短絡を防ぐには、実際に演算子の結果を計算し、その後テストする必要があります。これにより、レジスタが必要になり、コードの効率が低下します。
非論理演算子の場合、状況は逆になります。短絡を義務付けることは、次のことを意味します。
- コンパイラは、最小数のレジスタを使用する式の評価を選択できません。
- セマンティクスは、最大値と比較する場合など、多くの場合で実装定義 (または未定義) である場合があります。
コンパイラは、追加のテスト/ジャンプを追加する必要があります。マシンコードは
if(f() > g()) stmt;
次のようになります。call f mov return value of f to R1 test return value of f jump to next on zero call g compare R1 with return value of g jump to next on less-than equal execute stmt next: ...
それ以外の場合は、最初のテストとジャンプが不要であることに注意してください。
いいえ。比較演算子は、正しい答えを評価するために両方のオペランドを必要とします。対照的に、論理演算子&&
および||
場合によっては、正しい答えを得るために正しいオペランドを評価する必要がないため、「短絡」を行います。
いいえ、どうして彼らはそうでしたか。1 == 2
1 と 2 の両方を検査する必要があるかどうかを確認するため。
それはどのように機能しますか?短絡とは、LHS の評価結果のみに基づいて RHS を評価することを回避できることを意味します。
例えば
true || false
RHS を評価する必要はありtrue || x
ませtrue
んx
。
ただし、これは、リストした比較では機能しません。例えば:
5 == x
知らずに式の結果をどうやって知ることができますx
か?