【问题标题】:Returning void from method to prevent execution从方法返回 void 以防止执行
【发布时间】:2015-03-19 06:35:33
【问题描述】:

我试图退出一个在检查条件后返回void 的方法(我意识到如果我抛出异常会更容易,但我试图在这个项目中避免这种情况)。我有下面的代码,如果我正确解释它,它应该从if 语句中返回,但整个方法仍在执行。代码中是否存在问题(如果需要,我可以发布更多内容),还是有更好的方法来编写此代码而不进行异常处理?

void Rational::divide(Rational b) {
    if (b.numerator == 0) {
        cout << "Cannot divide by zero." << endl;
        return;
    } else if (b.numerator != 0) {
       numerator = numerator * b.denominator;
       denominator = denominator * b.numerator;
       reduce();
    }
}

编辑:我更新了代码以反映一些建议;澄清一下,if 语句本身正在正确执行(如果 b 为零,我会收到错误消息) - 一旦打印了错误消息,该方法的其余部分将继续运行。

编辑 2:更新为 else if 修订版。

【问题讨论】:

  • 检查你的条件为什么是假的。您应该检查分母是否等于零,而不是计算结果。
  • 您的 if 语句实际上是在检查分子是否为 0。您需要将其更改为 if ( b.denominator == 0 )
  • @Rubix Rechvin 我很确定 if 语句完全符合预期。该函数除以b,我们需要确保有理值不为零,因此检查分子是否为零。有可能b 参数的分子实际上并不完全是0
  • @MarkB 啊,既然它是一个 Rational 类,我们是否推断我们将“this”除以 b?因此,为了避免错误,我们需要断言 b.numerator 不为 0?我想我被错误消息绊倒了。它应该类似于“除数不能为零”
  • 所以它会打印消息并仍然运行其余代码?

标签: c++ if-statement return


【解决方案1】:

这就是你正在做的事情。你可能想在你的ifstatement 中做这样的事情:if((double)b.denominator == 0.f)

由于它们在内存中的表示方式,您在与浮点数或双精度数进行比较时也应该小心。它几乎永远不会完全为零,因此您应该与 epsilon 进行比较。

【讨论】:

  • 除法产生零并非不可能,它只要求分子为零。
  • 您不应将==double 一起使用。
  • 你总是可以使用: if (b.denominator -.0001) 而不是 ==
  • @RubixRechvin True,已修复并删除。
  • 编辑考虑到使用==与double的准确性;但是,问题不在于条件本身,而在于执行 return 后退出方法。
猜你喜欢
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2015-10-03
  • 1970-01-01
相关资源
最近更新 更多