摸索逗号运算符

Grokking the comma operator

我正在尝试理解逗号运算符。 reference 表示:

In a comma expression E1, E2, the expression E1 is evaluated, its result is discarded (...), and its side effects are completed before evaluation of the expression E2 begins (...).

我无法理解该子句 - “...表达式 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时,什么是'result'(被丢弃)什么是'side-effect'(即'completed',也许'retained')? ++x的结果不应该被丢弃,x的值保持不变吗?显示 x 递增的工作示例是 here.

换句话说,给定一个特定的表达式,我如何推断它是否会被评估并且它的结果会被丢弃,或者它是否是一个副作用并且它的结果可能会被计算并保留?

在 C++ 中,表达式可以产生一个值并可能导致副作用。在表达式 ++x, --y 中,您有两个子表达式构成整个表达式。左边++xreturnsx递增后,右边returnsy递减后。表达式将 return 逗号右侧 (y) 而不是左侧 x.

左侧的副作用被保留,所以x仍然递增。

如果您要执行作业,这可能更有意义。

For example

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

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