为什么在这个return语句中使用这个逗号?

时间:2016-12-25 13:01:35

标签: c++

我理解这个C ++函数的作用,但我不明白为什么return语句是这样写的:

int intDivide(int num, int denom){
  return assert(denom!=0), num/denom;
}

这里只有一个声明,因为只有一个;,但逗号让我困惑。为什么不写:

int intDivide(int num, int denom){
  assert(denom!=0);
  return num/denom;
}
除了"优雅"在第一个版本中有什么东西可以获得吗?

这个逗号究竟在做什么?它是否将单个陈述分为两部分,以致上述两个版本基本相同?

3 个答案:

答案 0 :(得分:5)

虽然代码似乎没有使用constexpr,但C ++ 11 constexpr函数被限制为只有一个语句必须是return语句。要执行非功能性断言并返回值,除了使用逗号运算符之外别无选择。但是,使用C ++ 14,这个约束被删除了。

我可以想象这个函数是从最初读过这样的宏

的宏重写的
#define INT_DIVIDE(nom,denom) (assert(denom != 0), nom/denom)

内置的逗号运算符只是对两个表达式进行排序。表达式的结果是第二个操作数。这两个功能确实是等同的。请注意,逗号运算符可以重载。如果是,则表达式不按顺序排列,结果是过载定义的结果。

在实践中,逗号运算符有时非常方便。例如,在扩展参数包时使用逗号运算符是很常见的:在某些用途中,每个扩展都需要生成一个值并避免void结果搞乱,可以使用逗号运算符有价值。例如:

template <typename... T>
void g(T const& arg) {
    std::initializer_list<bool>{ (f(arg), true)... };
}

答案 1 :(得分:1)

这是一种“语法糖”,在similar question中展开。

基本上e1, e2表示评估e1,然后评估e2 - 整个语句是e2的结果。这是一种简短而混淆(在我看来)写作你的建议的方式。也许作家在代码行上很便宜。

答案 2 :(得分:0)

来自C ++标准:

  

5.19逗号运算符 [expr.comma]
   1 逗号运算符从左到右分组。

expression:  
     assignment-expression  
     expression , assignment-expression  
     

用逗号分隔的一对表达式是   从左到右评估;左表达式是丢弃值   表达式(第5条)。 87 每个值的计算和副作用   与左表达式相关联的值在每个值之前排序   与正确表达相关的计算和副作用。该   结果的类型和值是权利的类型和值   操作数;结果与其右边的值类别相同   操作数,如果右操作数是glvalue和a,则是一个位字段   位字段。如果右操作数的值是临时值(12.2),   结果是暂时的。

是的,两个版本是相同的,除非逗号运算符过载,正如@StoryTeller评论的那样。