3

该语句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);
}
4

2 回答 2

12

逗号运算符的优先级最低,

表达式:
赋值表达式
表达式,赋值表达式

所以

x->a = x->b, ++x++->b;

实际上是

(x->a = x->b), ++(x++->b);

并且逗号运算符是一个序列点,因此对 的两个修改x是有序的,并且没有未定义的行为。

于 2013-06-18T15:41:37.050 回答
7

x->a = x->b, ++x++->b;不会调用未定义的行为。逗号运算符的优先级低于赋值运算符,因此此代码等效于:

x->a = x->b;
++x++->b;

在那里的第二行中,后缀++运算符正在修改x,前缀++运算符正在修改b取消引用结构的成员。没有违反序列点规则。

于 2013-06-18T15:41:17.593 回答