1. ホーム
  2. c++

[解決済み] C++のカンマ演算子とreturnの動作が違う?

2023-04-08 15:53:15

質問

これ( カンマ演算子 ):

#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;
}

出力 3 .

でカンマ演算子の動作が異なるのはなぜですか? return ?

どのように解決するのですか?

によると 演算子の優先順位 , カンマ演算子 よりも優先順位が低く operator= よりも優先順位が低く、したがって x = 2,3; と同じです。 (x = 2),3; . (演算子の優先順位は、演算子がどのように引数に束縛されるかを決定し、その優先順位に従って他の演算子よりきつく、または緩くなります)。

カンマ式は (x = 2),3 であって 2,3 . x = 2 が最初に評価され(そしてその副作用が完了し)、次にその結果が破棄され、次に 3 が評価される(実際には何もしない)。そのため x2 . ただし 3 はコンマ式全体の結果である(つまり x = 2,3 に代入するために使われることはないでしょう。 x . (これを x = (2,3); , x が割り当てられます。 3 .)

については return 2,3; の場合、カンマ表現は 2,3 , 2 が評価された後、その結果は破棄され、次に 3 が評価され、コンマ式全体の結果として返されます。 returnステートメント によって後で返されます。


に関する追加情報 表現 ステートメント

式とは、演算子とそのオペランドの並びで、計算を指定するものです。

x = 2,3; 表現文 , x = 2,3 がここでの表現です。

セミコロンが続く式はステートメントです。

構文 attr(optional) expression(optional) ; (1)

return 2,3; ジャンプ文 ( リターンステートメント ), 2,3 がここでの表現です。

構文 attr(optional) return expression(optional) ; (1)