我已经掌握了一些代码,我在那里看到了好奇的东西:
if (true == someFuncThatReturnsBool())
{
// Do somthing
}
bool someFuncThatReturnsBool()
{
bool retVal = false;
// .... do some stuff
return retVal;
}
在“if”语句中,他们使用true == someFuncThatReturnsBool()
作为布尔表达式,对于布尔值,我通常会这样做:
if (someFuncThatReturnsBool())
{
// Do somthing
}
如果有的话,生成的代码会有什么不同? 使用“true ==”符号是否有任何优势,其他可能为了清楚,函数返回一个布尔值?...类型检查??,个人我看不到任何优势......
谢谢:)
答案 0 :(得分:5)
与生成的代码有什么区别?
无
使用“true ==”符号是否有任何优势,除此之外 也许为了清楚一点,该函数返回一个布尔值?
IFF函数命名不佳然后我可能会编写显式版本。否则,如果从函数中明显看出它是布尔检查(即is_XXX
方式),则没有理由使用它。
答案 1 :(得分:2)
在我看来,如果someFuncThatReturnsBool
函数名称只读取某个值,而不是特别是布尔值,那么可读性优势就会很小。成千上万(也许是大多数人)会称我为白痴。
通常,布尔变量和函数将命名为is_whatever
或has_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)
{
...
}
at
和items
都没有表示该值是布尔值。 if (item)
不正确 - 如果有的话,它表明“如果这是一个项目”,这不是这里的意图。 if (item == true)
没有这种气味。
即使臭臭的代码是正确的,每次重新访问该代码时,气味都会分散注意力,因此有一些额外的代币可以让IMO清除这种气味。
这就是为什么我通常更喜欢命名is_whatever
而不是whatever_flag
的原因。虽然whatever_flag
显然是一个布尔值,但它仍然读得不对。它是缩写英语的“语法” - “if flag”表示“如果这是一个标志”而不是“如果设置了这个标志”。
显然,有些新手写if (whatever == true)
因为他们有这个心理模板,每个if
都需要一个相对的操作符。这个模板是错误的,所以这是一个愚蠢的新手刻板印象。还有一些其他类似的案例,主要是明显的,比如写value + 0
,value * 1
或value && true
。来自Haskell的一个令人惊讶的...
main = do putStrLn "Hello World"
在此,“心理模板”是任何一元一系列动作都需要do
。但是,在这种情况下,只有一个monadic动作,因此不需要将一系列动作组合成一个动作。所需要的只是......
main = putStrLn "Hello World"
在这种情况下,我会保留判断是否偶尔值得保持do
的可读性 - 我没有经验。
无论如何,就个人而言,我认为嘲笑别人做某事,很难接受有时会有这样做的有效案例。毕竟,心理模板是if (whatever == true)
自然是荒谬的。
当然,如果你想要安静的生活,最好永远不要那样做。
答案 2 :(得分:1)
这样做没有任何好处。它可以使它稍微更具可读性,如果它从函数名称中不明显它应该返回一个布尔值,但在这种情况下你最好重命名函数
答案 3 :(得分:1)
没有任何优势,编译器可能会抛出“true ==” - 部分。如果函数名清楚它返回一个布尔值(例如以“是”或“有”开头),那么你可以立即看到它返回一个布尔值。
也许代码用于返回错误代码作为返回值,并且这被重构为布尔值,但是没有删除返回值检查?
答案 4 :(得分:1)
除了明确比较的代码更长且更难阅读之外,没有区别。