通常更快:
if (num >= 10)
或:
if (!(num < 10))
答案 0 :(得分:25)
编译器很可能会优化那种东西。不要担心,在这种情况下只需编码清晰。
汇编语言通常具有>=
和<=
的操作,这些操作与<
和>
的步骤数相同。例如,使用Motorola 68k时,如果要比较数据寄存器%d0
和%d1
以及%d0
大于或等于%d1
时的分支,你会说像:
cmp %d0, %d1 // compare %d0 and %d1, storing the result
// in the condition code registers.
bge labelname // Branch to the given label name if the comparison
// yielded "greater than or equal to" (hence bge)
认为a >= b
意味着计算机将执行两个操作而不是一个操作,因为“或”在“大于或等于”中,这是一个常见的错误。
答案 1 :(得分:11)
任何体面的编译器都会将这两个语句优化为完全相同的底层代码。事实上,它很可能会产生完全相同的代码:
if (!(!(!(!(!(!(!(num < 10))))))))
我会选择你的第一个,因为它的意图似乎更清晰(比你的第二个选择更明确,大规模比我上面发布的那些怪物更清晰)。我倾向于考虑如何阅读它。想想这两句话:
我相信第一个更清楚。
实际上,只需使用"gcc -s"
进行测试以获取汇编程序输出,两个语句都会生成以下代码:
cmpl $9,-8(%ebp) ; compare value with 9
jle .L3 ; branch if 9 or less.
我相信你在浪费时间看这样的微优化 - 你会更有效地看待算法选择等事情。那里的投资回报可能会大得多。
答案 2 :(得分:3)
一般来说,任何速度差异都无关紧要,但它们并不一定意味着完全相同。
在许多语言中,比较浮点值NaN对所有比较都返回false,因此如果num = NaN,则第一个为false,第二个为true。
#include <iostream>
#include <limits>
int main ( ) {
using namespace std;
double num = numeric_limits<double>::quiet_NaN();
cout << boolalpha;
cout << "( num >= 10 ) " << ( num >= 10 ) << endl;
cout << "( ! ( num < 10 ) ) " << ( ! ( num < 10 ) ) << endl;
cout << endl;
}
输出
( num >= 10 ) false
( ! ( num < 10 ) ) true
因此编译器可以使用单个指令在第一种情况下比较num和值10,但在第二种情况下可以发出第二条指令来反转比较结果。 (或者它可能只是使用一个分支,如果为零,而不是分支,如果非零,你不能说一般)
其他语言和编译器会有所不同,对于它们真正具有相同语义的类型,发出的代码可能完全相同。