【问题标题】:Multiple IFs with the same return具有相同回报的多个 IF
【发布时间】:2011-09-24 03:18:33
【问题描述】:

我见过一些看起来像这样的代码:

if (a) return false;
if (b) return false;
if (c) return false;
return true;

上面和上面的性能有区别吗

if (a || b || c) return false;
else return true;

一般来说,处理这个问题的首选情况是什么?也许在我的第二个示例中没有 else ?

编辑:似乎很多人被我返回 true 或 false 并建议返回 !(a || b || c) 的事实误导了。这不是我想问的。想象一下,如果我不想返回真或假,而是想返回“是”或“否”,或者 23423 或 3。

【问题讨论】:

  • 为什么不简单地使用return a || b || c(假设实际表达式abc 相当短......)
  • 他可能想要返回 1 和 2 而不是 true 或 false?
  • @Dirk:给出的例子是return !(a || b || c),但我完全同意使用return 表达式
  • “想象一下,如果不是返回真或假”...return !(a || b || c) ? "Yes" : "No";(或return "Yes\0No\0" + (a || b || c) * 4;;-P)
  • WTF! return "Yes\0No\0" + (a || b || c)*4;??请不要建议你不希望你的同事写的东西,你可能会让别人认为混淆代码是个好主意。你肯定不想维护一个充满这种类型代码的产品......

标签: c++ if-statement


【解决方案1】:

两者的唯一优势是可读性,优化编译器为这两种情况生成几乎相同的代码是合理的。

如果 3 个测试都很短,那么 return !(a||b||c); 是完全合理的

如果它们是长函数调用,那么您的第一个示例会更易于阅读。

【讨论】:

    【解决方案2】:

    这一切都取决于编译器如何编译代码。出于所有实际目的,它们是相同的。 (只要你确保使用简短的或“||”)

    【讨论】:

    • @RAY:告诉我如何使用快捷方式或“||”在 C++ 中?
    • 我现在对 C++ 有点生疏了,但我相信如果 a 和 b 和 c 是数字,你可以使用按位或因为 C++ 认为 0 为假,非零为真的。不过,请随时纠正我。
    • @RAY:您将按位与逻辑混淆了,在 C++ 中逻辑是单独的运算符(即:|||)。
    • 如果我没记错的话,C++ 并没有清楚地分离布尔值和数字......
    • @Ray:你是对的......这在大多数情况下都可以工作,尽管它可能效率较低(因为必须评估所有 a、b 和 c)或更多(为了避免分支声明)。不过,这绝对是个坏主意,因为它暗示了对不存在的位值的一些更微妙的意义。而且,它不适用于 AND,例如1 & 2false1 && 2true
    【解决方案3】:

    简而言之:代码没有显着差异,您可以进一步将您的代码写成return !(a || b || c);


    如果您的条件非常简单,例如if (fata_is_invalid || login_failed),那么您可以按照您的建议将它们全部组合成一行。

    有时您会看到非常庞大的条件,在这种情况下,最好将它们分成更小的块(通过多个 if 语句或通过重新格式化您的代码)。不管怎样,这只是一个可读性的事情——使用你喜欢的任何方法(或者你的“风格指南”所提倡的任何方法)。

    编译器超级好用,在这些情况下,无论你写什么,它都会生成(几乎)相同的代码。

    【讨论】:

      【解决方案4】:

      &&, ||和 ?是 C++ 中的 short-circuit 运算符,这意味着只有在第一个参数不能确定表达式的值时才计算第二个参数。

      这意味着您可以简单地为您的示例代码编写:

      return !(a || b || c);
      

      【讨论】:

      • "&&、|| 和 ? 是 C++ 中的短路运算符" - 除非它们被重载。如果原始代码有可能依赖于 b 未评估这一事实,如果 a 为真,那么您需要在进行此更改之前检查所涉及的类型。
      【解决方案5】:

      分隔 if 并使用 ||运算符不一定相同!如果 a、b 或 c 中的任何一个是用户定义的类型并重载其中一个 ||或将运算符转换为任何整数或指针类型,那么这两种构造可能会产生不同的结果!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 2019-12-28
        • 2020-08-19
        • 2020-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多