【问题标题】:Does if (myBool == true) differ computational wise to if(myBool)?if (myBool == true) 在计算上与 if(myBool) 有什么不同吗?
【发布时间】:2014-02-06 05:24:11
【问题描述】:

我阅读了一个关于比较说写的布尔值的编码风格建议

if (myBoolValue == true) { ... }
if (myBoolValue == false) { ... }

而不是写

if (myBoolValue) { ... }
if (!myBoolValue) { ... }

因为它增加了代码的可读性,即使它们是等效语句。我很清楚这不是一种通常的编码实践,但我同意它在某些情况下可能会增加可读性。

我的问题是两者在代码执行优化方面是否有任何区别,或者(一个良好实现的)编译器是否将它们翻译成相同的东西?

【问题讨论】:

  • 非常可疑的推荐。很多人,当然包括我在内,都认为冗余语法会降低可读性。
  • 我也认为它会降低可读性。不过,不应该对编译后的代码产生影响。
  • 仅供参考 maurus.net/resources/programming-languages/php "(string)"false" == (int)0true"

标签: optimization if-statement compiler-construction coding-style


【解决方案1】:

所有语言的产生式都不相同。

例如,它们可能会在 JavaScript 和 C 中对“myBoolValue”的某些“非布尔”值产生不同的结果。

// JavaScript
[] == true         // false
[] ? true : false  // true

// C
#define true 1
#define false 0
int x = -1;
x == true         // 0 (false)
x ? true : false  // true (1)

要查看特定 编译器对特定 编程语言的作用(既允许它做什么,又可以做什么),请检查生成的程序集/机器/字节码。

(无论如何,更喜欢并专门使用后一种形式。)

【讨论】:

    【解决方案2】:

    除了 JavaScript 之类的情况,我猜 Java 带有自动装箱和布尔值,这两种形式的语义可能不同,这实际上取决于编译器优化。

    我从来不理解这个建议。如果myBool 是布尔值,(myBool == true), 也是布尔值,那么为什么它不需要((myBool == true) == true),以此类推?这在哪里停止?答案肯定不是从一开始就开始吗?

    确实,阅读的越多,可读性就越差?

    【讨论】:

    • ((myBool == true) == true) 增加可读性 ..! xD
    【解决方案3】:

    在 C(和许多其他语言)中没有布尔类型,都是数字表达式,所以 myBoolValue 可能等于 2 或任何不同于 0 和 1 的值,并且用数字比较它们不会给你正确的结果。

    #define true 1
    #define false 0
    if (5 == true) //...
    

    为提高可读性,请将变量命名为有意义的变量(例如 isNonZero、isInGoodState、isClosed、LoopEnded...),而不是将它们与 true 进行比较

    另一种方法是在需要真实情况时将它们与 0 或 false 进行比较 (myBoolValue != false)。此外,使用 bool 类型(如果可用)可能会解决一些问题。

    【讨论】:

    • 从 1999 年标准开始,C 确实有一个名为 _Bool 的内置布尔类型(如果有 #include <stdio.h>,则别名为 bool)。
    【解决方案4】:

    行为取决于语言和被测试值的类型。这两种形式并不在所有情况下都等价。

    在 C 中,条件通常使用整数表示,0 被视为假,任何非零值都被视为真。将这样的相等值与true 进行比较是无效的;例如,如果该值恰好是 2 或 -1,则它在逻辑上为真,但不等于 true。从 C99 开始,C 确实有一个名为 _Bool 的内置布尔类型,如果您有 #include <stdbool.h>,则别名为 bool。但是使用其他类型仍然很常见,尤其是int来表示条件,甚至以各种方式重新定义boolfalsetrue

    C++ 有一个内置的 bool 类型,带有 falsetrue 字面量,因为它的开发很早就开始了,但它仍然保留了它的大部分 C 血统。其他受 C 启发的语言可能也存在类似问题。

    在具有内置布尔类型并且不允许将其他类型的值直接用作条件的语言中if (x)if (x == true) 更有可能是等价的。如果它们在语义上是等价的,我希望任何体面的优化编译器都能为任何一种形式生成相同的代码,或者非常接近。

    但我强烈不同意风格建议。与falsetrue 的显式比较,即使在等同于直接测试值的情况下,恕我直言不利于可读性。

    如果您有一个变量,其值表示一个条件,则更重要的是给它一个表示该条件的名称。编程语言代码不一定要遵循英语语法,而是类似

    if (file_is_open)
    

    不会通过将其更改为更具可读性

    if (file_is_open == true)
    

    作为一名 C 程序员,我喜欢比许多其他程序员更明确地编写我的条件;我会写if (ptr != NULL) 而不是if (ptr),以及if (c != '\0') 而不是if (c)。但如果一个变量已经是一个条件,我认为添加多余的比较是没有意义的。

    value == true 本身就是一个条件;如果if (value == true) 应该比if (value) 更具可读性,为什么if ((value == true) == true) 不更好?

    【讨论】:

      猜你喜欢
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多