gpt4 book ai didi

c++ - 重复使用 prefix++ 运算符时的未定义行为

转载 作者:IT老高 更新时间:2023-10-28 13:03:06 26 4
gpt4 key购买 nike

我读到了 answer关于未定义的行为,我看到以下声明:

++++++i;     // UB, parsed as (++(++(++i)))

我不认为这是未定义的行为。我有一个疑问,它真的是 C++ 中的 UB 吗?如果是,那么如何?

另外,我使用 g++ prog.cpp -Wall -Wextra -std=gnu++1z -pedantic 命令制作程序和编译,它工作正常,没有任何警告。它给出了预期的输出。

#include <iostream>
using namespace std;

int main()
{
int i = 0;
cout<<++++++i<<endl;
}

最佳答案

在 C++03 中,这是未定义的行为。在 C++11 中不是这样。各种预增量之间没有序列点。如果 i 是一个用户定义的类型,那么它将是定义良好的行为,因为那时会有一个函数调用(一个序列点)。

在 C++11 中,序列点的概念被替换为先排序/后排序。缺陷 637 (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#637) 提供了一个先前未定义的构造变得明确定义 (i =++i + 1) 的示例。

要了解为什么它不是未定义的行为,让我们看看我们需要的部分。 ++i 等价于 i = i + 1 (除了 i 只计算一次)。此外,如果我们将 i = i + 1 替换为 inc,则 ++(i = i + 1) 变为 inc = inc + 1

[expr.ass] 状态:

In all cases, the assignment is sequenced after the value computation of the right and left operands, and before the value computation of the assignment expression.

因此 i = i + 1 中的赋值在 inc 的值计算之前排序;然而,inc = inc + 1 中的赋值是在inc 值计算之后排序的。没有未定义的行为,因为分配是按顺序排列的。

关于c++ - 重复使用 prefix++ 运算符时的未定义行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47600716/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com