1. ホーム
  2. c++

[解決済み] CとC++で+=の結果はどうなりますか?

2023-02-21 02:57:17

質問

次のようなコードがあります。

#include <stdio.h>
int main(int argc, char **argv) {
    int i = 0;
    (i+=10)+=10;
    printf("i = %d\n", i);
    return 0;
}

gccでCのソースとしてコンパイルしようとすると、エラーが出ます。

error: lvalue required as left operand of assignment

しかし、私はg++を使用してC + +ソースとしてそれをコンパイルすると、私は何のエラーも得られず、私は実行可能ファイルを実行するとき。

i = 20

なぜ動作が違うのか?

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

複合代入演算子のセマンティクスがCとC++で異なっています。

C99標準、6.5.16、パート3。

代入演算子は、左オペランドによって指定されたオブジェクトに値を格納する。代入式は 代入式は、代入後の左オペランドの値を持ちますが、それは lvalueではありません。

C++の5.17.1では

代入演算子(=)と複合代入演算子はすべて右から左へグループ化されます。すべて、左オペランドとして変更可能な lvalueを必要とし、代入が行われた後、左オペランドの型と値を持つlvalueを返します。

EDITです。 の動作は (i+=10)+=10 の動作は、C++98 では未定義ですが、C++11 では明確に定義されています。 以下を参照してください。 この回答 による質問に対する NPE をクリックすると、規格の関連部分が表示されます。