web-dev-qa-db-ja.com

戻り値のあるC ++のコンマ演算子の異なる動作?

これ(コンマ演算子に注意してください):

#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と異なる動作をするのはなぜですか?

80
ps95

演算子の優先順位 によると、 コンマ演算子 は_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)

138
songyuanyao

コンマ(式の区切りとも呼ばれる)演算子は、左から右に評価されます。したがって、return 2,3;return 3;と同等です。

x = 2,3;の評価は、演算子の優先順位のため、(x = 2), 3;です。評価はまだ左から右であり、全体式の値は3であり、副作用はxであり、値2を想定しています。

32
Bathsheba

この文:

  x = 2,3;

2つの式で構成されます

> x = 2
> 3

演算子の優先順位 なので、=はコンマ,よりも優先されるため、x = 2が評価され、after3x2と等しくなります。


代わりにreturnで:

int f(){ return 2,3; }

言語の構文は次のとおりです。

return <expression>

returnは式の一部ではありません。

したがって、その場合、2つの式が評価されます:

> 2
> 3

ただし、2番目(3)のみが返されます。

19
Biagio Festa

括弧で優先順位を強調するだけの単純なアプローチを適用してみてください:

_( x = 2 ), 3;_

return ( 2, 3 );

これで、二項演算子「、」が左から右の両方で同じように機能することがわかります。

2
Luciano