1

C標準(できればC89、90)は何について言っていますか:

int a,b;
a = 4;
b = (a += 1);

?

私はそれをテストしましたが、結果は ですb=5。これは私が期待するものです。スタンダードで安心したいだけです。*=同じことが、/=、 、 などの類似の演算子にも当てはまります。代入後に必ず左辺の値を返すことが&=わかっています。、などが標準に従って同じように動作する=かどうかを知りたいだけです。+=*=

4

3 に答える 3

4

代入演算子は値を「返す」わけではありません。値を返すか、標準で言えば値を持ちます。

左辺値にはなりませんが、値は左オペランドのものです。抜粋は次のとおりです。

(3.3.16) 代入式は、代入後に左オペランドの値を持ちますが、左辺値ではありません。

はすべて= *= /= %= += -= <<= >>= &= ^= |=代入演算子であるため、この点に関しては同じように動作します。

于 2012-09-01T03:49:03.090 に答える
1

副作用がなければ問題ありません。

代入演算子はシーケンス ポイントではありません。つまり、評価の順序は保証されません。

( )のように使用すればb = (a += 1);問題ありません。

ただし、それ以外の場合は、次のような問題が発生する可能性があります。

b = (a += 1) + a; // undefined

この例では、変数aが 2 回参照されていることに注意してください。つまり、 またはが最初に評価されるかどう(a += 1)かがわからないということです。したがって、 への 2 番目の参照が追加される前か後aかはわかりません。a1

各変数のみを参照する場合は、+=and co で代入します。一度、副作用は問題ではなく、関連する演算子を使用して、代入+=に値を返すことができます。

于 2012-09-01T03:28:55.747 に答える
0

b = 5これにより、とが得られるはずa = 5です。これは、a+=1取得しaて追加1するためです。次に、に割り当てaますb

あなたの質問には少し混乱していますが*=、すべて同じように機能します/=-=

たとえば、次のようにすることもできますint c = 7。次に、次の行で do c*=3. これは になりますc = 21。あなたの例で、あなたが望まなかった場合a = 5; それなら、やらないa+=1で、代わりにやりましょうa+1

于 2012-09-01T03:29:31.723 に答える