您好,我在某个网站上找到了这个程序。让我感到困惑的是,该程序修改了相同的对象并将其在同一表达式中使用,因此它是未定义的行为吗?还是可以的,因为逗号操作员,
可以保证从左到右的评估?
int x = 10, y;
// The following is equavalent to y = x++
y = (x++, printf("x = %dn", x), ++x, printf("x = %dn", x), x++);
// Note that last expression is evaluated
// but side effect is not updated to y
printf("y = %dn", y);
printf("x = %dn", x);
输出:
x = 11
x = 12
y = 12
x = 13
逗号操作员,保证从左到右的评估?
是的,有一个警告。来自https://en.cppreference.com/w/cpp/language/operator_other#built-in_comma_operator
在逗号表达式
E1, E2
中,评估了表达式E1
,其结果被丢弃(尽管如果具有类型,则不会在包含完整表达式的结束之前被破坏),并且其副作用在表达式E2
的评估开始
警告:
(请注意,用户定义的操作员无法保证测序)(直到C 17)。
警告不适用于您的案件,因为您不使用任何用户定义的逗号操作员功能。
除非您从事压力测试编译器的业务,否则您绝不应该编写这样的代码。使用更简单,更明显地理解的代码。
x++;
printf("x = %dn", x);
++x;
printf("x = %dn", x);
x++;
y = x;