如何使用`return()`作为表达式?

时间:2013-05-12 12:39:29

标签: c++ return

||if (...)更简洁,更容易输入,所以我想要一种方法来执行以下操作(在我的代码中会发生很多事情):

int bar() {...; return successFlag;}
int foo() {
    bar() || return(...);  // return early on errors
    ...
}

有可能吗?

或者甚至更好,是否可以return从[{1}}返回main,而不是通过bar进行链接?

2 个答案:

答案 0 :(得分:2)

对于第一部分,不:return是关键字,而不是表达式,因此不能以该形式组合。我认为你本能地将||字面意思地理解为英语意义上的“或” - 显然这不是它的含义。

对于第二部分,你可以 - 在理论上 - 通过使用例外,但这是一个强烈气馁的做法。例外情况适用于“特殊情况”,更具体地说,代码无法在本地恢复的错误条件(在当前函数/方法的上下文中)以及必须在更高级别确定适当操作的情况。

使用异常作为一般流控制机制有两个问题:

  • 性能:C ++编译器针对“非特殊”代码路径进行了优化(因为这是应该正常发生的事情),因此异常处理机制往往非常慢。这不是因为缺乏代码优化,而是因为如果没有例外,机制需要零或接近零的成本,即使成本是异常需要大量的工作来处理。

  • 代码清晰度/可测试性:对控制流使用异常会使代码难以阅读并且单独正确地进行单元测试。

答案 1 :(得分:-2)

第一部分 - 没有。对于第二个:setjmp和longjmp。但请注意,它们都破坏了通常的基于C ++堆栈的析构函数调用,并且可能与异常混合不好。