C標準(できればC89、90)は何について言っていますか:
int a,b;
a = 4;
b = (a += 1);
?
私はそれをテストしましたが、結果は ですb=5
。これは私が期待するものです。スタンダードで安心したいだけです。*=
同じことが、/=
、 、 などの類似の演算子にも当てはまります。代入後に必ず左辺の値を返すことが&=
わかっています。、などが標準に従って同じように動作する=
かどうかを知りたいだけです。+=
*=
C標準(できればC89、90)は何について言っていますか:
int a,b;
a = 4;
b = (a += 1);
?
私はそれをテストしましたが、結果は ですb=5
。これは私が期待するものです。スタンダードで安心したいだけです。*=
同じことが、/=
、 、 などの類似の演算子にも当てはまります。代入後に必ず左辺の値を返すことが&=
わかっています。、などが標準に従って同じように動作する=
かどうかを知りたいだけです。+=
*=
代入演算子は値を「返す」わけではありません。値を返すか、標準で言えば値を持ちます。
左辺値にはなりませんが、値は左オペランドのものです。抜粋は次のとおりです。
(3.3.16) 代入式は、代入後に左オペランドの値を持ちますが、左辺値ではありません。
はすべて= *= /= %= += -= <<= >>= &= ^= |=
代入演算子であるため、この点に関しては同じように動作します。
副作用がなければ問題ありません。
代入演算子はシーケンス ポイントではありません。つまり、評価の順序は保証されません。
( )のように使用すればb = (a += 1);
問題ありません。
ただし、それ以外の場合は、次のような問題が発生する可能性があります。
b = (a += 1) + a; // undefined
この例では、変数a
が 2 回参照されていることに注意してください。つまり、 またはが最初に評価されるかどう(a += 1)
かがわからないということです。したがって、 への 2 番目の参照が追加される前か後a
かはわかりません。a
1
各変数のみを参照する場合は、+=
and co で代入します。一度、副作用は問題ではなく、関連する演算子を使用して、代入後+=
に値を返すことができます。
b = 5
これにより、とが得られるはずa = 5
です。これは、a+=1
取得しa
て追加1
するためです。次に、に割り当てa
ますb
。
あなたの質問には少し混乱していますが*=
、すべて同じように機能します/=
。-=
たとえば、次のようにすることもできますint c = 7
。次に、次の行で do c*=3
. これは になりますc = 21
。あなたの例で、あなたが望まなかった場合a = 5
; それなら、やらないa+=1
で、代わりにやりましょうa+1
。