我正在尝试理解逗号运算符。该参考说:
在逗号表达式 E1, E2 中,表达式 E1 被求值,其结果被丢弃 (...),它的副作用在表达式 E2 开始求值之前完成 (...)。
我无法理解这个子句 - “...表达式 E1 被评估,它的结果被丢弃(...),它的副作用在...之前完成”。具体来说,什么是保留,什么是丢弃?
例如,在这个 SO answer的例子中:
int x = 0;
int y = some_number;
for(; x < y; ++x, --y)
{
// Do something which uses a converging x and y
}
Run Code Online (Sandbox Code Playgroud)
当我们执行 a 时++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;
Run Code Online (Sandbox Code Playgroud)
z成为对的引用y,因此我们将打印0