VS2008 c ++编译器会优化下面的if语句吗?
if (false == x) { ...}
而不是:
if (!x) { ... }
和
if (false == f1()) { ...}
而不是:
if (!f1()) { ... }
我认为if(false == ...)版本更具可读性,您是否同意或有另一个可以提出的技巧?它会一样快吗?谢谢。
这就是我不喜欢的原因!x:
if (25 == a->function1(12345, 6789) &&
45 == b->function1(12345, 6789) &&
!c->someOtherFunction(123)) { ... }
以下似乎更好:
if (25 == a->function1(12345, 6789) &&
45 == b->function1(12345, 6789) &&
false == c->someOtherFunction(123)) { ... }
一个好的编译器应该为这两个代码块生成相同的代码。
然而,不要担心false == f1()
与!f1()
,你应该更担心这个例子中的短路评估:
if (25 == a->function1(12345, 6789) &&
45 == b->function1(12345, 6789) &&
!c->someOtherFunction(123)) { ... }
如果a->function1()
调用发生评估的结果不是25,那么某些编译器将生成跳过b->function1()
和c->someOtherFunction()
的执行的代码 - 原因是编译器已经知道整个if ()
语句的结果,所以它可以跳到正确的位置。
如果你的代码依赖于被任何被跳过的函数修改的状态,你可能会遇到令人讨厌的惊喜。
我个人发现表单if (!x) { ... }
最具可读性,但是现在它们都将导致相同的代码。
编辑:在你的例子中,我会做以下几点:
if ( a->function1(12345, 6789) == 25 &&
b->function1(12345, 6789) == 45 &&
!(c->someOtherFunction(123))) { ... }
但这实际上只是个人喜好的事情。 做你最可读的东西。 这不会有什么区别。
我认为if(false == ...)版本更具可读性,您是否同意或有另一个可以提出的技巧?
你这样做是错的。
false == x
返回一个布尔值,这显然必须与true
比较!
if (true == (false == x)) { ...}
会更好。 但是,这又会返回一个布尔值,所以为了安全起见,让代码更具可读性,我们最好这样做:
if (true == (true == (false == x))) { ...}
。 等等。 一旦你开始比较布尔值到布尔值,你会停在哪里? 结果将始终是另一个布尔值,为了保持一致,必须将其与布尔值进行比较。
或者你可以学会理解你正在使用的语言,并使用if (!x) { ...}
,它表达了你想要的东西。
你认为哪个更具可读性?
if (false == x) { ...}
转换为“如果它是真的,false等于x”。 if (!x) { ...}
转换为“如果x不正确”。 你能诚实地认真地说,第一种形式是“更具可读性”吗? 你会用这句话来说吗? “如果错误等于x”是真的吗?
它不是更具可读性,它只是呼喊任何读取代码的程序员“我不明白语句或布尔值”。
链接地址: http://www.djcxy.com/p/39583.html上一篇: Would VS2008 c++ compiler optimize the following if statement?
下一篇: In Java, is it more expensive to create an object, or get the objects value?