【问题标题】:Handling boolean function in an if statement [duplicate]在 if 语句中处理布尔函数 [重复]
【发布时间】:2013-09-01 18:19:44
【问题描述】:

我继承了一些代码,我看到了一些奇怪的东西:

if (true == someFuncThatReturnsBool())
{
   // Do somthing
}

bool someFuncThatReturnsBool()
{
    bool retVal = false;
    // .... do some stuff

    return retVal;
}

在“if”语句中,他们使用true == someFuncThatReturnsBool() 作为布尔表达式,对于布尔值,我通常会这样做:

if (someFuncThatReturnsBool())
{
   // Do somthing
}

生成的代码有什么不同(如果有的话)? 使用“true ==”表示法有什么好处,除此之外,为了清楚起见,函数返回布尔值?...类型检查??,我个人看不到任何优势...

谢谢:)

【问题讨论】:

  • 你是对的。没有任何优势,只是浪费和冗余的语法,以及可能毫无意义的额外字节码。有人不懂语言。为什么停在 ('true == ...)? Why not (true == (true == ...))`?
  • @EJP 大声笑,谢谢!...这就是我的想法,但是当我看到有人做了某件事时,我“不明白”我认为值得一问...比如,他们知道我不知道什么! :)
  • @MikeSeymour 啊,如果是这样,我很抱歉,我确实看过,但我没想到要在标题中实际添加代码! - 所以我错过了那个
  • @code_fodder:不用道歉;这不是很容易搜索的东西。重复项不会(通常)被删除,并且可以使将来的搜索更容易。

标签: c++ if-statement boolean


【解决方案1】:

这样做没有任何好处。如果从函数名称中看不出它应该返回一个布尔值,它可能会使其更具可读性,但在这种情况下,你最好重命名函数

【讨论】:

    【解决方案2】:

    生成的代码有什么不同(如果有的话)?

    没有。

    使用“true ==”表示法有什么好处,除此之外 也许为了清楚起见,该函数返回一个布尔值?

    如果函数名称不好,那么也许我会编写显式版本。否则,如果从函数中可以看出它是布尔检查(即is_XXX 时尚),则没有理由使用它。

    【讨论】:

    • 如果函数名称不好,我会更改它的名称。使用像if ( true == function() ) 这样的扭曲符号不会让事情变得更易读。
    • @JamesKanze:我也会更改名称,但这并不总是可行的。不过,可读性部分可能值得商榷。
    • 感谢您的肯定 :) @JamesKanze "twisted"....lol
    【解决方案3】:

    没有任何优势,编译器可能会丢弃“true ==”-part。如果函数名称清楚地表明它返回一个布尔值(例如以“is”或“has”开头),那么您可以立即看到它返回一个布尔值。

    也许用于将错误代码作为返回值返回的代码,并且被重构为布尔值,但没有删除返回值检查?

    【讨论】:

    • 在这种情况下,它不会是true == ...,而是someValue == ...。 (当然,将常量放在== 左侧的想法一开始是相当扭曲的。)
    • 谢谢 :) ... 不,在这种情况下,代码始终是布尔值(或被编辑,因此显然是这样的)
    • @JamesKanze 有些人提倡在左边使用常量,以防止出现可怕的“赋值而不是比较”错字(即防止 if (3 = a) ... 编译。)在这种情况下这并不有意义.
    • @Rafał Dowgird - 这就是所谓的“尤达条件”。它要防止的那种错误(if (a = 3) 而不是if (a == 3))无论如何都应该在现代编译器中触发警告。
    【解决方案4】:

    在我看来,如果 someFuncThatReturnsBool 函数名称读起来只是一些值,而不是特别是布尔值,则可能会有一点可读性优势。成千上万的人(也许是大多数人)会因此而称我为白痴。

    通常,布尔变量和函数将命名为 is_whateverhas_whatever。所以通常情况下,if 语句读作if (is_whatever)if (has_whatever)。如果我没有看到,或者当然是亲戚运营商,我觉得有点臭。

    但有时布尔变量和函数不使用该名称公式,尤其是在通过模板参数指定布尔类型时。在这种情况下,我可能会使用if (whatever == true)。或者,使用尤达条件,即if (true == whatever)

    可能的例子...

    std::map<int,bool> items;
    
    ...
    
    if (items.at (key) == true)
    {
      ...
    }
    

    atitems 都不表示该值是布尔值。 if (item) 不正确 - 如果有的话,它暗示“如果这是一个项目”,这不是这里的意图。 if (item == true) 没有这种味道。

    即使臭代码是正确的,每次重新访问该代码时,气味都会分散注意力,因此 IMO 值得多加几个标记来清除这种气味。

    这就是为什么我通常更喜欢命名 is_whatever 而不是 whatever_flag。虽然whatever_flag 显然是一个布尔值,但它读起来仍然不太正确。这是缩写英语的“语法”——“if flag”表示“如果这是一个标志”而不是“如果设置了这个标志”。

    显然,一些新手写if (whatever == true),因为他们有这个心理模板,每个if 都需要一个相对运算符。这个模板是错误的,所以这是那些白痴新手的刻板印象之一。还有一些其他类似的情况,大多很明显,比如写value + 0value * 1value &amp;&amp; true。来自 Haskell 的一个有点令人惊讶的...

    main = do putStrLn "Hello World"
    

    在此,“心理模板”是任何单子动作序列都需要do。但是,在这种情况下,只有一个单子动作,因此无需将一系列动作组合成一个动作。所需要的只是......

    main = putStrLn "Hello World"
    

    在这种情况下,我将保留判断是否偶尔值得保留 do 以提高可读性 - 我没有经验。

    不管怎样,就我个人而言,我认为在嘲笑人们做某事之后,很难接受有时候这样做是有正当理由的。毕竟,心理模板是 if (whatever == true) 自动可笑。

    当然,如果你想要平静的生活,最好不要那样做。

    【讨论】:

    • 值得一读...我喜欢地图示例,definatley 在这种情况下有助于使其显而易见:)
    【解决方案5】:

    除了显式比较的代码更长,更难阅读之外,没有什么区别。

    【讨论】:

      猜你喜欢
      • 2012-02-09
      • 2016-11-08
      • 2019-06-30
      • 2013-03-26
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多