我理解这个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;
}
除了"优雅"在第一个版本中有什么东西可以获得吗?
这个逗号究竟在做什么?它是否将单个陈述分为两部分,以致上述两个版本基本相同?
答案 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评论的那样。