问题描述
我正在尝试使用逗号运算符。 reference说:
在逗号表达式E1,E2中,对表达式E1进行求值,结果被舍弃(...),并且在开始对表达式E2求值之前,其副作用已经完成(...)。
我无法理解该子句-“ ...表达式E1被求值,其结果被舍弃(...),并且其副作用在...之前完成。”具体来说,保留什么和丢弃什么?
例如,在this SO answer的示例中:
int x = 0;
int y = some_number;
for(; x < y; ++x,--y)
{
// Do something which uses a converging x and y
}
当我们执行++x
时,“结果”是什么(被丢弃),什么是“副作用”(即“完成”并且可能是“保留”)? ++x
的结果不应该被丢弃并且x
的值保持不变吗?显示x
递增的工作示例是here。
换句话说,给定特定表达式,我如何推断它是否将被评估并且其结果将被丢弃,或者它是否是副作用并且其结果可能会被计算并保留?
解决方法
在C ++中,表达式可以产生一个值,并可能导致副作用。在表达式++x,--y
中,有两个子表达式构成整个表达式。左边的++x
递增后返回x
,右边的递减后返回y
。该表达式将返回逗号的右侧(y
,而不是左侧的x
。
保留了左侧的副作用,因此x
仍然递增。
如果您要执行分配,这可能更有意义。
int x = 1;
int y = 1;
int& z = (++x,--y);
std::cout << z << std::endl;
z
成为对y
的引用,因此我们将打印0