【问题标题】:Replacing chained ifs with short-circuited operations用短路操作替换链式 if
【发布时间】:2013-03-11 14:30:38
【问题描述】:

这是一个非常琐碎的问题: 有四个布尔函数:a()、b()、c() 和 d()。我想继续按顺序调用它们,直到第一个返回 true。而不是做传统的

if(!a()) {
    if(!b()) {
        if(!c()) {
            d();
        }
    }
}

if(!a() && !b() && !c()) d();

我曾考虑将表达式编写为短路评估。

(a() || b() || c() || d());

但我从未见过在 C/C++ 代码中以这种方式完成此测试。我缺少这种方法有什么问题吗?

谢谢。

【问题讨论】:

  • 我可以看到五个布尔函数。
  • @chris or 不会改变意思:d() 只有在所有其他函数都为假时才会执行。
  • 从维护的角度来看,我建议不要这样做。当人们看到短路版本时,代码的作用可能不会立即显而易见(如果您担心的话)。您必须询问 SO 的行为这一事实应该暗示其他人阅读您的代码时会发生什么。
  • @Loghorn,哎呀,你是对的。我的错。我刚刚意识到这个问题真正问的是什么。
  • 它有效。但是像大多数棘手的代码一样,在没有解释的情况下做这样聪明的事情是不负责任的,最好是在之前的评论中。让它工作并不像确保下一个阅读它的程序员理解它为什么它工作那么重要。

标签: c++ c short-circuiting


【解决方案1】:

您编写的代码是有效的。仅当其他布尔函数返回 false 时才会评估 d()

但是,短路评估的可读性较差,并且从维护的角度来看容易出错,因为读者可能无法轻易理解它。

【讨论】:

  • 你错了。如果 NO OTHER 函数返回 true,则评估 d()。我想这说明了您对可读性的看法。
  • 谢谢本。很着急。
  • @user666412,字面上不容易出错,但有点难以阅读和理解。例如,正如 Ben Voigt 在 cmets 中指出的那样,即使我在匆忙回答问题时也犯了错误。
  • 我认为这是一个很好的答案 +1。容易出错很好,人们明白你的意思。
【解决方案2】:

它们是等价的,但短路求值解决方案的可读性可能较差,尤其是在函数名称很长或接受参数的情况下。

【讨论】:

    猜你喜欢
    • 2011-06-30
    • 2021-08-20
    • 2011-07-16
    • 1970-01-01
    • 2014-05-29
    • 2016-08-21
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多