c++中使用逗号操作符时的未定义行为



我正在努力学习如何在c++中评估表达式。所以尝试和阅读不同的例子。下面是代码,我无法理解它是否会产生未定义的行为或不。代码来自这里。所以我猜既然他们用了,这肯定不是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;

产生未定义的行为。我的问题是:

  1. 但是,在逗号操作符内使用的相同语句是否会产生UB(如上面的代码所示)?也就是说,下面给定的语句会产生UB吗?
int m = (++n, std::cout << "n = " << n << 'n', ++n, 2*n);
  1. 我们如何解释上述语句的顺序前,未排序等行为发生了什么?

PS:我知道自c++ 11以来,我们使用sequence-before等而不是sequence point,所以我为什么要用当前标准来解释。

从同一页面的cppreference:

在逗号表达式E1, E2中,表达式E1被求值,其结果被丢弃(尽管如果它具有类类型,它不会在包含完整表达式的表达式结束之前被销毁),及其副作用在表达式E2开始求值之前完成(注意,用户定义的operator,不能保证排序)(直到c++ 17)。

由于代码中的逗号操作符是内置的,因此++n,std::cout << "n = " << n << 'n'与其他表达式之间的顺序定义得很好。没有未定义的行为

因为你可能已经读过上面的内容,这里是标准的措辞:

用逗号分隔的一对表达式从左到右求值;左边的表达式是一个丢弃值表达式。左表达式在右表达式之前排序([intro.execution])。

相关内容

  • 没有找到相关文章

最新更新