gpt4 book ai didi

c++ - 带括号表达式的逗号运算符用法示例

转载 作者:行者123 更新时间:2023-11-30 00:43:28 25 4
gpt4 key购买 nike

什么是 res += (f(i), f(i + 1)), f(i + 2);评价到?

#include <iostream>
int f(int x)
{
static int cnt = 0;
return ++cnt * x;
}
int main ()
{
int res = 0;
for (int i = 0; i < 6; ++i) {
res += (f(i), f(i + 1)), f(i + 2);
// f(i);
// res += f(i + 1);
// f(i + 2);
std::cout << res << std::endl;
}
std::cout << res;
}

我不知道这条线是如何工作的:

res += (f(i), f(i + 1)), f(i + 2);

我理解为相当于注释部分,但为什么呢?

最佳答案

这个答案解释了你用这个表达式观察到的行为:

res += (f(i), f(i + 1)), f(i + 2);

...但我建议不要在任何生产代码中使用它,请参阅答案的结尾以了解一些推理。


在表达式中使用时,逗号,对应于comma operator这是标准运算符:

// Evaluate E1 then E2, discards the result of E1, return E2
E1, E2

+=运算符也是一个运算符,比,的优先级更高(,在C++中的优先级最低)所以:

int f();
int g();

int x = 0;

// Equivalent to:
// x += f();
// g();
x += f(), g();

// Equivalent to:
// f();
// x += g();
x += (f(), g());

在您的例子中,您有一对括号括起前两个调用:

res += (f(i), f(i + 1)), f(i + 2);
// ^--------------^

所以:

  1. f(i), f(i + 1) 被评估(由于括号),这导致调用 f(i) then f(i + 1),并将f(i + 1)的结果存储在临时中;
  2. 临时通过+=运算符添加到res
  3. res += (f(i), f(i + 1)) 的结果被丢弃;
  4. f(i + 2) 被评估。

如注释中所指定,此代码等效于:

f(i);
res += f(i + 1);
f(i + 2);

编译器无法删除对 f(i)f(i + 1) 的调用,因为它们有副作用(static< 的更新 变量 cnt).


我建议不要对此类事情使用逗号运算符,主要是为了清楚起见:

  • 与 3 行版本相比,你不会从中获得任何好处,除了单行版本的行为不是那么明显(这个问题就是一个很好的例子......)。
  • 由于逗号运算符对非内置类型的工作方式,非内置类型在 C++17 之前的行为有所不同。例如,如果 f 返回一个类似 big_int 的类,则无法保证运算符的操作数的求值顺序。

从 C++17 开始,你得到 fold expressions对于逗号运算符,在我看来,这是使用逗号运算符的极少数原因之一。

关于c++ - 带括号表达式的逗号运算符用法示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54277030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com