逗号运算符

问题描述

我正在尝试使用逗号运算符。 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仍然递增。

如果您要执行分配,这可能更有意义。

For example

int x = 1;
int y = 1;
int& z = (++x,--y);
std::cout << z << std::endl;

z成为对y的引用,因此我们将打印0