1

ここに私が理解できない小さなコードがあります

int x=30, *y, *z;
y=&x; 
z=y;
//y++ = z++;
//*y++ = *z++;
x++;
printf("x=%p, y=%p, z=%p y=%p\n ", &x, y,z,y++);
return 0;

これらの疑問は私を悩ませています:
なぜ有効(z++ = y++;)な割り当てが無効なのか(z = y). この割り当て(*y++ = *z++)はどういう意味ですか?

さらに、このプログラムを実行すると、次の出力が得られます。

x = 0028FF04 , y = 0028FF08, z = 0028FF04 y = 0028FF04
私の予想は
x = 0028FF04 , y = 0028FF04, z = 0028FF04 y = 0028FF08

4

3 に答える 3

4

代入には左側と右側があります。左辺は、いわゆる左辺値(左の場合は l) である必要があります。これは、基本的に、計算結果やリテラルではなく、変数でなければならないことを意味します。を割り当てることはできx = 5 + 2ますが、割り当てることはできません5 + 2 = x

左辺値ではないため、割り当てることはできませz++ = y++ん。インクリメント前z++の値を結果とする式です。z変数への参照zなどではありません。

*z++ = *y++ただし、ここではポインターを扱うため、を割り当てることができます。基本的に左側 (右側は重要ではありません。ここでは左辺値の制限のみが重要です) は次zのことを意味しますz。これにより、有効な左辺値が得られます。

于 2013-09-08T00:20:24.273 に答える
2

(z = y) が有効であるのに (z++ = y++;) が無効な割り当てであるのはなぜですか?

サブ式Z++Y++両方が値を返します。サブ式の値を割り当てるには左辺値が必要です。値を別の値に割り当てることはできません。への割り当ては、 asy++への割り当てにz++似ています。一方、は左辺値であり、それに値を割り当てることに問題はありません。そのため、は有効な式です。343 = 4zz = y

この割り当て (*y++ = *z++) はどういう意味ですか?

この代入は、 を指す変数の値を をz指す変数に代入しy、インクリメントすることを意味します (コンパイラがこれをyz見なすため*(y++) = *(z++))。

さらに、このプログラムを実行すると、次の出力が得られます:
x = 0028FF04 , y = 0028FF08, z = 0028FF04 y = 0028FF04
一方、私の期待は
x = 0028FF04 , y = 0028FF04, z = 0028FF04 y = 0028FF08 ?

この背後にある理由は、次のステートメントです。

printf("x=%p, y=%p, z=%p y=%p\n ", &x, y,z,y++);

と を一緒に使用するyと、y++未定義の動作が呼び出されます。互いに依存する副作用を持つ式を使用していますが、これらの副作用が適用される順序が定義されていないコンテキストでは。したがって、期待どおりの結果が得られるという保証はありません。

于 2013-09-08T00:49:41.130 に答える