我正在努力学习如何在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;
产生未定义的行为。我的问题是:
- 但是,在逗号操作符内使用的相同语句是否会产生UB(如上面的代码所示)?也就是说,下面给定的语句会产生UB吗?
int m = (++n, std::cout << "n = " << n << 'n', ++n, 2*n);
- 我们如何解释上述语句的顺序前,未排序等行为发生了什么?
PS:我知道自c++ 11以来,我们使用sequence-before等而不是sequence point,所以我为什么要用当前标准来解释。
从同一页面的cppreference:
在逗号表达式
E1, E2
中,表达式E1被求值,其结果被丢弃(尽管如果它具有类类型,它不会在包含完整表达式的表达式结束之前被销毁),及其副作用在表达式E2开始求值之前完成(注意,用户定义的operator,
不能保证排序)(直到c++ 17)。
由于代码中的逗号操作符是内置的,因此++n
,std::cout << "n = " << n << 'n'
与其他表达式之间的顺序定义得很好。没有未定义的行为
因为你可能已经读过上面的内容,这里是标准的措辞:
用逗号分隔的一对表达式从左到右求值;左边的表达式是一个丢弃值表达式。左表达式在右表达式之前排序([intro.execution])。