这些代码之间是否有区别?

Ske*_*ith 2 c++ optimization if-statement

今天我正在编写代码,当时我偶然发现了一些事情,并没有想到它是否有任何影响.

这有两种方法可以做同样的事情

if(foo != true)
{
bar ++;
}

if(foo == true)
{
}
else
{
bar ++;
}
Run Code Online (Sandbox Code Playgroud)

现在我知道编译器可能会将它优化为同样的东西,但我想知道它们的区别,因为你不能总是指望它们.

我的问题是第二种选择是否真的会产生某种惩罚,因为它会给支票添加另一个命令?

是的,这是一个错字.

Kon*_*lph 10

两者都不好.除了第二个包含拼写错误(=而不是==)之外,将布尔值与常量进行比较只是多余的.只需直接测试它们的值:

if (! foo) …
// Instead of
if (foo != true) …

// or

if (foo) …
// Instead of
if (foo == true) …
Run Code Online (Sandbox Code Playgroud)

首先,它消除了通过拼写错误创建错误的可能性(正如您已经慷慨地展示的那样).但除此之外,它更符合逻辑.

(但请注意,效率并不高.这些陈述完全相同.)


sha*_*oth 5

那些具有相同的效果,并且任何体面的编译器都可能发出相同的机器代码 - 检查布尔值并选择做什么将以尽可能最快的方式完成."添加else"不是它的内部工作方式 - 这只是if-else必须具有一定效果的语句,它取决于编译器如何实现这种效果.仅添加关键字不一定会导致额外的代码发射.

如果你真的在乎你应该检查发出的机器代码,看看编译器在每种情况下发出的代码.