在if语句中处理布尔函数

时间:2013-08-29 10:46:27

标签: c++ if-statement boolean

我已经掌握了一些代码,我在那里看到了好奇的东西:

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

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

    return retVal;
}

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

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

如果有的话,生成的代码会有什么不同? 使用“true ==”符号是否有任何优势,其他可能为了清楚,函数返回一个布尔值?...类型检查??,个人我看不到任何优势......

谢谢:)

5 个答案:

答案 0 :(得分:5)

  

与生成的代码有什么区别?

  

使用“true ==”符号是否有任何优势,除此之外   也许为了清楚一点,该函数返回一个布尔值?

IFF函数命名不佳然后我可能会编写显式版本。否则,如果从函数中明显看出它是布尔检查(即is_XXX方式),则没有理由使用它。

答案 1 :(得分:2)

在我看来,如果someFuncThatReturnsBool函数名称只读取某个值,而不是特别是布尔值,那么可读性优势就会很小。成千上万(也许是大多数人)会称我为白痴。

通常,布尔变量和函数将命名为is_whateverhas_whatever。通常情况下,if语句会显示为if (is_whatever)if (has_whatever)。如果我没有看到,或者当然是相对的操作员,对我来说似乎有点臭。

但有时布尔变量和函数不使用该名称公式,尤其是在通过模板参数指定布尔类型的情况下。在这种情况下,我可能会使用if (whatever == true)。或者,使用Yoda条件,即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 && true。来自Haskell的一个令人惊讶的...

main = do putStrLn "Hello World"

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

main = putStrLn "Hello World"

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

无论如何,就个人而言,我认为嘲笑别人做某事,很难接受有时会有这样做的有效案例。毕竟,心理模板是if (whatever == true)自然是荒谬的。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

没有任何优势,编译器可能会抛出“true ==” - 部分。如果函数名清楚它返回一个布尔值(例如以“是”或“有”开头),那么你可以立即看到它返回一个布尔值。

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

答案 4 :(得分:1)

除了明确比较的代码更长且更难阅读之外,没有区别。