更改对象并将其在同一表达式中使用它是不确定的行为,但是子表达式由逗号运算符分开



您好,我在某个网站上找到了这个程序。让我感到困惑的是,该程序修改了相同的对象并将其在同一表达式中使用,因此它是未定义的行为吗?还是可以的,因为逗号操作员,可以保证从左到右的评估?

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;

相关内容

  • 没有找到相关文章

最新更新