【发布时间】:2021-11-17 14:54:00
【问题描述】:
我正在尝试学习如何在 C++ 中评估表达式。所以尝试和阅读不同的例子。下面是我无法理解它是否会产生未定义行为的代码。代码来自here。所以我想既然他们用过,这一定不是UB。但我有疑问。
#include <iostream>
int main()
{
int n = 1;
//std::cout << n << " " << ++n << std::endl;//this is undefined behavior i am sure
int m = (++n, std::cout << "n = " << n << '\n', ++n, 2*n);//will this also produce UB because here also we have cout in the same manner as above?
std::cout << "m = " << (++m, m) << '\n';
}
正如您在上面的代码中看到的,我确信声明:
cout << n << " " << ++n << endl;
产生未定义的行为。 我的问题是:
- 但是在逗号运算符中使用的相同语句会产生 UB(如上面的代码所示)吗?也就是说,下面给出的语句会产生 UB。
int m = (++n, std::cout << "n = " << n << '\n', ++n, 2*n);
- 我们如何解释上述语句的行为在前序、未排序等方面发生了什么。
PS:我知道从 C++11 开始,我们使用序列之前等而不是序列点,所以我为什么要根据当前标准进行解释。
【问题讨论】:
-
这些都不是 C++17 及更高版本中的 UB。
-
通过您的编辑,您现在总共提出了 3 个问题。请注意,我的答案针对的是 1 和 2,但不是您 PS 中的答案。请每个问题只回答一个问题,并且在收到答案后尽量不要更改问题来询问其他问题。
-
你没有使用
std::cout << n << " " << ++n;“在逗号操作符内”。 -
我只在我的问题中添加了一个陈述,因为我认为它会澄清我在问什么。我现在才注意到,在我最初错过的命令运算符中
'\n'之后有一个逗号。既然我已经看到了我错过的逗号,一切都变得有意义了。
标签: c++ c++11 c++17 undefined-behavior expression-evaluation