C++ 序列点和 C++17 中求值顺序的变化

标签 c++ c++17 undefined-behavior sequence-points

<分区>

我对 changes 的方式有点困惑到 C++17 会影响您不应在序列点之间修改一个变量 2 次的规则。

例如,这在 C++17 中是指定的、未指定的还是未定义的?

void func(int x, int y);
int x=47;
func(x++,x++);

我猜是 UB。

编辑:额外数据点:c++2a 模式下的 clang HEAD 给出

prog.cc:8:11: warning: multiple unsequenced modifications to 'x' [-Wunsequenced]

edit2: 与 C++2a 模式下的 gcc HEAD 相同

prog.cc:8:15: 警告:'x' 上的操作可能未定义 [-Wsequence-point]

edit3:使用预增量 gcc 和 clang 给出 different results

最佳答案

你问题中的例子

int x = 0;
f(x++, x++);

现在是未指定的行为,而不是未定义的行为。这意味着它是有效代码,但实际发生的情况可能因编译器而异。

关于C++ 序列点和 C++17 中求值顺序的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55590378/

相关文章:

c++ - lambda 表达式语法错误

c++ - 如何检查从菜单中选择了哪个项目?如何通过选择菜单项发送 int/wxstring?

c++ - 不能在此上下文中应用属性 'fallthrough'

c++ - 比较来自外部 API 的相同类型的两个结构

c++ - 使用 std::launder 从指向非事件 union 成员的指针获取指向事件 union 成员的指针?

c++ - 执行时溢出/下溢是未定义的行为吗?

c - if((result=f())==0) 是未定义的行为吗?

c++ - 尝试创建自定义字符串类,但我不断收到 C2440 和 E0415 错误

c++ - 使用 AES-256-CBC 模式 openssl 的数据加密,不会返回不需要填充的相同大小的数据吗?

c++ - 类模板参数推导是否适用于 std::map?