首页 > 解决方案 > 更改对象并在同一表达式中使用它但子表达式由逗号运算符分隔是未定义的行为吗?

问题描述

您好,我在某个网站上找到了这个程序。让我感到困惑的是,这个程序修改了同一个对象并在同一个表达式中使用它,因此它是未定义的行为吗?还是没关系,因为逗号运算符,保证从左到右进行评估?

int x = 10, y;

// The following is equavalent to y = x++ 
y = (x++, printf("x = %d\n", x), ++x, printf("x = %d\n", x), x++);

// Note that last expression is evaluated 
// but side effect is not updated to y 
printf("y = %d\n", y);
printf("x = %d\n", x);

输出:

x = 11
x = 12
y = 12
x = 13

标签: c++comma-operator

解决方案


逗号运算符,保证从左到右的评估?

是的,有一个警告。来自https://en.cppreference.com/w/cpp/language/operator_other#Built-in_comma_o​​perator

在逗号表达式E1, E2中,表达式E1被求值,它的结果被丢弃(尽管如果它具有类类型,它直到包含完整表达式的末尾才会被销毁),并且它的副作用在表达式的求值E2开始之前完成

警告:

(请注意,用户定义的运算符不能保证排序)(C++17 前)。

该警告不适用于您的情况,因为您没有使用任何用户定义的逗号运算符功能。


除非您从事对编译器进行压力测试的业务,否则您永远不应该编写这样的代码。使用更简单、更容易理解的代码。

x++;
printf("x = %d\n", x);

++x;
printf("x = %d\n", x);

x++;
y = x;

推荐阅读