可能重复:
Which one will execute faster, if(flag==0) or if(0==flag)?
我通常把我的平等条件写成:
if(0==x)
很多人都这样做,而不是
if(x==0)
这样编译器就会在我意外输入=而不是==时告诉我。
有人告诉我,有些编译器将其实现为两个寄存器加载,而不是使用不等于零的操作,因此效率较低。
任何人都知道这是否是一个合理的评论?
答案 0 :(得分:8)
有人告诉我,有些编译器将其实现为两个寄存器加载,而不是使用不等于零的操作
没有技术理由这样做。所以不,任何有价值的编译器不都会产生这种无关的区别:因为两个语句都是严格等同的,并且由于编译器可以轻易地识别它们,所以它会对它们进行相同的处理。
请注意,对于内置类型和行为良好operator ==
的用户定义类型,仅为true。 理论上用户可以提供非对称operator ==
重载,而不会给出这种等价。
答案 1 :(得分:4)
谁知道“某些编译器”的作用,但总的来说,不,我不希望合理编译器生成的代码有任何差别。
答案 2 :(得分:0)
我不这么认为。编译器会将该表达式解释为比较,效果将相同。如果编译器足够智能,它将检测到0
可以被优化。
当您有多个比较时,重要的是比较顺序:
if(conditionA && conditionB && (conditionC || conditionD)) {...}
在这种情况下,您应该将conditionA作为导致if
更快失败的条件,而不是让执行分析所有其他条件,然后才会看到条件A失败。
答案 3 :(得分:0)
尝试编写下面的小程序,然后根据需要确定哪些程序。您在寻找小代码或快速执行吗?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int x = atoi(argv[1]);
int zeros=0;
int i;
for (i=0; i<100000; i++) {
if (0==x) {
zeros++;
}
}
printf("zeros: %d\n",zeros);
return 0;
}
答案 4 :(得分:0)
为什么不尝试对2种解决方案进行基准测试? :
#include <stdio.h>
#include <time.h>
#define LOOPS 1000000000
void main(void)
{
clock_t start1, start2, end1, end2;
int x=1,i;
start1=clock();
for(i=0;i<LOOPS;i++)
{
if (x==0)
{
x=1;
}
}
end1=clock();
start2=clock();
for(i=0;i<LOOPS;i++)
{
if (0==x)
{
x=1;
}
}
end2=clock();
printf("x==0 %d ns\n", end1-start1);
printf("0==x %d ns\n", end2-start2);
}