を取得するために左側を評価するために (古いまたは新しい) のどの値を使用するかについて混乱があるため、ステートメントa[i]=i++;
は未定義です。このコンパイラは、.. でコンパイルされた場合、このステートメントに対して警告を発します (操作は未定義の可能性があります) 。i
L-value
-Wall
以下のコードでは、ステートメントx->a = x->b, ++x++->b;
x
が変更されており、左側ではL-value
. このステートメントを で実行しても、コンパイラは警告を出しません-Wall
。
これが未定義の動作ではない理由を誰かが説明してもらえますか? ありがとう!
struct Data {
int a;
int b;
} y[4] = { 10, 20, 30, 40};
struct Data *x = y;
int i;
for(i=0; i<2; i++) {
x->a = x->b, ++x++->b;
printf("%d %d\t", y[i].a, y[i].b);
}