a[i]=i++;
的声明是不确定的,因为有一个混淆,即i
(旧的或新的)值用于评估左侧以获得L-value
。如果使用-Wall
进行编译,此编译器将给出警告(操作..可能未定义)。为什么在C中提到的代码是未定义的行为
在下面的代码,在声明中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);
}
仅仅因为编译器没有警告,并不意味着这个行为真的很好定义。 –