私は現在、C ++ Primerという本を使ってC ++を学んでいます。本の演習の1つは次のとおりです。
次の式の意味を説明してください。
someValue ? ++x, ++y : --x, --y
私たちは何を知っていますか?三項演算子はコンマ演算子よりも優先順位が高いことがわかっています。2項演算子を使用すると、これは非常に簡単に理解できましたが、3項演算子を使用すると、少し苦労します。二項演算子で「優先順位が高い」とは、式の前後に優先順位の高い括弧を使用できることを意味し、実行は変更されません。
三項演算子の場合は、次のようにします。
(someValue ? ++x, ++y : --x, --y)
コンパイラーがコードをグループ化する方法を理解するのに私を助けない同じコードを効果的にもたらします。
ただし、C ++コンパイラでのテストから、式がコンパイル:
されることがわかり、演算子自体が何を表すことができるかわかりません。したがって、コンパイラーは三項演算子を正しく解釈するようです。
次に、2つの方法でプログラムを実行しました。
#include <iostream>
int main()
{
bool someValue = true;
int x = 10, y = 10;
someValue ? ++x, ++y : --x, --y;
std::cout << x << " " << y << std::endl;
return 0;
}
結果:
11 10
一方、someValue = false
それを印刷している間:
9 9
なぜC ++コンパイラは、3項演算子のtrueブランチの場合x
にのみインクリメントするコードを生成しますが、3項演算子のfalseブランチの場合は両方x
をデクリメントしy
ますか?
私はこのように真の枝を括弧で囲んでさえいます:
someValue ? (++x, ++y) : --x, --y;
しかし、それでも結果は11 10
です。
?
は条件演算子です。三項演算子という用語は、3つのオペランドを持つ演算子を意味します。条件演算子は三項演算子の一例ですが、言語には(理論的には)複数の三項演算子を含めることができます。