c++ - 更改对象并在同一表达式中使用它但子表达式由逗号运算符分隔是未定义的行为吗?
问题描述
您好,我在某个网站上找到了这个程序。让我感到困惑的是,这个程序修改了同一个对象并在同一个表达式中使用它,因此它是未定义的行为吗?还是没关系,因为逗号运算符,
保证从左到右进行评估?
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
解决方案
逗号运算符,保证从左到右的评估?
是的,有一个警告。来自https://en.cppreference.com/w/cpp/language/operator_other#Built-in_comma_operator
在逗号表达式
E1, E2
中,表达式E1
被求值,它的结果被丢弃(尽管如果它具有类类型,它直到包含完整表达式的末尾才会被销毁),并且它的副作用在表达式的求值E2
开始之前完成
警告:
(请注意,用户定义的运算符不能保证排序)(C++17 前)。
该警告不适用于您的情况,因为您没有使用任何用户定义的逗号运算符功能。
除非您从事对编译器进行压力测试的业务,否则您永远不应该编写这样的代码。使用更简单、更容易理解的代码。
x++;
printf("x = %d\n", x);
++x;
printf("x = %d\n", x);
x++;
y = x;
推荐阅读
- css - 偏移背景图像并将其置于中心位置
- python - python docx设置背景颜色表格单元格
- html - 响应式标头行为奇怪
- java - 线程“主”javax.persistence.PersistenceException 中的异常:org.hibernate.MappingException:没有 JDBC 类型的方言映射:-151
- php - 谷歌一键注册和自动登录不返回idToken
- emacs - 在 emacs 中设置 OCAML - 点上的自动完成
- javascript - 如何在 create-react-app 中使用 scss 文件?
- python - python3 502 网关错误
- python - Tensorflow 损失和准确性在不同时期之间不会发生变化
- caching - Haproxy 1.8 和缓存