これ(コンマ演算子に注意してください):
#include <iostream>
int main() {
int x;
x = 2, 3;
std::cout << x << "\n";
return 0;
}
出力2。
ただし、カンマ演算子でreturn
を使用すると、次のようになります。
#include <iostream>
int f() { return 2, 3; }
int main() {
int x;
x = f();
std::cout << x << "\n";
return 0;
}
出力。
コンマ演算子がreturn
と異なる動作をするのはなぜですか?
演算子の優先順位 によると、 コンマ演算子 は_operator=
_よりも優先順位が低いため、_x = 2,3;
_は_(x = 2),3;
_と同等です。 (演算子の優先順位は、演算子がその引数にバインドされる方法を決定します。優先順位に応じて、他の演算子よりも厳密または緩くなります。)
ここで、コンマ式は_(x = 2),3
_ではなく_2,3
_であることに注意してください。 _x = 2
_が最初に評価され(そしてその副作用が完了し)、結果が破棄され、その後_3
_が評価されます(実際には何もしません)。 x
の値が_2
_である理由です。 _3
_はコンマ式全体の結果(つまり_x = 2,3
_)であり、x
への割り当てには使用されないことに注意してください。 (x = (2,3);
に変更すると、x
は_3
_で割り当てられます。)
_return 2,3;
_の場合、コンマ式は_2,3
_であり、_2
_が評価され、その結果が破棄され、その後_3
_が評価され、コンマ式全体の結果として返されます。 return statement によって返されます。
Expressions および Statementsに関する追加情報
式は、計算を指定する一連の演算子とそのオペランドです。
_x = 2,3;
_は 式ステートメント 、_x = 2,3
_はここの式です。
セミコロンが続く式はステートメントです。
構文:
attr(optional) expression(optional) ; (1)
_return 2,3;
_は ジャンプステートメント (- returnステートメント )、_2,3
_はここの式です。
構文:
attr(optional) return expression(optional) ; (1)
コンマ(式の区切りとも呼ばれる)演算子は、左から右に評価されます。したがって、return 2,3;
はreturn 3;
と同等です。
x = 2,3;
の評価は、演算子の優先順位のため、(x = 2), 3;
です。評価はまだ左から右であり、全体式の値は3であり、副作用はx
であり、値2を想定しています。
この文:
x = 2,3;
2つの式で構成されます:
> x = 2
> 3
演算子の優先順位 なので、=
はコンマ,
よりも優先されるため、x = 2
が評価され、after3
。 x
は2
と等しくなります。
代わりにreturn
で:
int f(){ return 2,3; }
言語の構文は次のとおりです。
return <expression>
注return
は式の一部ではありません。
したがって、その場合、2つの式が評価されます:
> 2
> 3
ただし、2番目(3
)のみが返されます。
括弧で優先順位を強調するだけの単純なアプローチを適用してみてください:
_( x = 2 ), 3;
_
return ( 2, 3 );
これで、二項演算子「、」が左から右の両方で同じように機能することがわかります。