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?