我正在尝试查找逗号运算符。参考资料显示:
在逗号表达式E1,E2中,表达式E1被评估,其结果被丢弃(…(,并且其副作用在表达式E2的评估开始之前完成(…(
我无法查询子句-";。。。表达式E1被评估,其结果被丢弃(…(,并且其副作用在…之前完成&";。具体来说,什么是保留的,什么是丢弃的?
例如,在这个SO答案的例子中:
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
增量的工作示例。
换句话说,给定某个表达式,我如何推断它是否会被评估并丢弃其结果,或者它是否是一个副作用,其结果可能会被计算并保留?
在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