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かはわかりません。a1
各変数のみを参照する場合は、+=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。