鱼C论坛

 找回密码
 立即注册
查看: 2747|回复: 18

这两句代码有什么区别

[复制链接]
发表于 2014-7-9 09:52:20 | 显示全部楼层 |阅读模式
50鱼币
请问, if(a == 0)     和   if (!a) 在效率上有什么区别?
如果执行非常多次,比如500万次。时间上会有差别吗?

最佳答案

查看完整内容

int a= 1; if (a == 0) { a = 1; } if (!a) { a = 1; } //反汇编 int a= 1; 00BB705E mov dword ptr [a],1 if (a == 0) 00BB7065 cmp dword ptr [a],0 00BB7069 jne main+32h (0BB7072h) { a = 1; 00BB706B mov dword ptr [a],1 } if (!a) 00BB7072 cmp dword ptr [a], ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-9 09:52:21 | 显示全部楼层
本帖最后由 santaclaus 于 2014-7-9 10:12 编辑

int a= 1;
if (a == 0)
{
        a = 1;
}

if (!a)
{
        a = 1;
}

//反汇编
        int a= 1;
00BB705E  mov         dword ptr [a],1  
       if (a == 0)
00BB7065  cmp         dword ptr [a],0  
00BB7069  jne         main+32h (0BB7072h)  

        {
                a = 1;
00BB706B  mov         dword ptr [a],1  
        }

        if (!a)
00BB7072  cmp         dword ptr [a],0  
00BB7076  jne         main+3Fh (0BB707Fh)  

        {
                a = 1;
00BB7078  mov         dword ptr [a],1  
        }

从反汇编代码来看,完全一样。。。

点评

我很赞同!: 5.0
我很赞同!: 5
好  发表于 2014-7-16 21:52
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-9 12:08:33 | 显示全部楼层
7:      if(a == 0)
0040102F   cmp         dword ptr [ebp-4],0
00401033   jne         main+32h (00401042)
12:     if(!a)
00401042   cmp         dword ptr [ebp-4],0
00401046   jne         main+45h (00401055)
反汇编一下就可以知道了啊  完全一样
这个技巧还是得知道下很实用的 一定要自己会调试哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-9 14:13:05 | 显示全部楼层
判断语句本身没有差别,差别在于你的数据结构
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-9 15:32:47 | 显示全部楼层
第二种方法更给力~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-9 17:03:19 | 显示全部楼层
本帖最后由 zhoushilei 于 2014-7-9 17:04 编辑

这两句代码的效率几乎是一样的,对于赋值的这些内部操作的代码,我们都认识是O(1)时间的,经常在大O复杂度中被省略。只有对于一些大量循环或者是大量的输入输出的时候,才会计算到O(N),O(N方)这样的。无论的现实中还有在ACM中,这个代码的时间探讨其实都毫无意义。是O(1)时间的。

例如如
#include <iostream>
using namespace std;
void main()
{
      int a=1,n=50000000;
      for(int i=0;i<n;i++)
      {
            if(a==0)
                 cout<<"执行!"<<endl;
       }
}
这个的复杂度是O( n)      
#include <iostream>
using namespace std;
void main()
{
      int a=1,n=50000000;
      for(int i=0;i<n;i++)
      {
            if(!a)
                 cout<<"执行!"<<endl;
       }
}
这个的复杂度也认为是O( n)   
所以说基本上我们是忽略这两个的区别,而仅仅关注于代码执行数。所以虽然可能有差别,但是几乎在分析中是忽略的。如果真的要看时间的差别,可以看的汇编;还可以用ctime的函数来测试一下时间,具体请自行百度。
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-9 21:17:41 | 显示全部楼层
本帖最后由 折心灬小轩 于 2014-7-9 21:20 编辑

这两句在效率上的比较不能靠反汇编来简单地解决,首先,不同编译器对相同语句的不同解释是一个问题,其次,楼上说用ctime测试一下,个人认为每次调用函数执行中断时的机器状态不同也会引起误差,所以这个问题不能这样简单的用一些常见方式来解决。

我的建议:
1.如果想通过反汇编来解决此问题,你必须排除一切无关条件,比如说,在使用相同编译器系统下保证他的优化结果是相同的
2.由于机器状态不可控,所以任何以外部中断为思想的方法都不能解决此问题
3.从技术角度分析,上述语句肯定有差别,但是在现代编译器系统的优化下,结果应该是一样的,所以你无论怎么样写都是可以的,如果非要一个原始码的效率比较,见下:
if(a == 0):从编译器动作看,首先需要取量a的地址,之后用a的地址进行一次定址寻址,将其操作数移动至指定的运算器,之后再cmp,之后就,,,效率可见一斑。
if (!a)同样的,取址,定址寻址和上面的动作是完全一样的

他们两个唯一的区别就是:编译器系统工作的时间, if(a == 0)比较正规,但由于其操作符与操作数较多,编译器在编译时要耗费更多的时间,相比之下 if (!a)就简洁多了,不过容易出错。。。

总结:在同等优化技术的条件下,前者编译时间比后者长,但差距几乎可以不计,两者运行时效率相同;在不同等优化技术的条件下,无法比较

满意请采纳,不满意请追问

点评

我很赞同!: 5.0
我很赞同!: 5
好,很详细,很专业  发表于 2014-7-16 21:53
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-9 21:31:09 | 显示全部楼层
没区别,if(a)中只要不为零就能执行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-12 23:52:29 | 显示全部楼层
不要当语言专家~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-13 01:10:24 | 显示全部楼层
{:2_27:}         有一点小小的区别,.一直纠结意义不大,在有些运算程序上的话还是有一点点小区别.不过在大多程序用意思都一样..如果下次遇到这样的问题用用就自然懂了.慢慢摸吧!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-13 01:52:30 | 显示全部楼层
楼主可以从“《高质量C和C++编程指南》一书,第四章 4.3节,if语句 ”,专门分析if语句与零值比较,我们编码出发点的是其中之一,1,人容易理解,2机器执行高效。但两者是对立的,时间和空间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-13 13:06:50 | 显示全部楼层
分析的很好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-13 13:16:29 | 显示全部楼层
莫有区别吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-14 10:24:00 | 显示全部楼层
都一样,不过第二个感觉更好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-15 16:29:41 | 显示全部楼层
大家都是高手,菜鸟路过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-23 12:12:41 | 显示全部楼层
厉害   厉害  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-23 17:35:12 | 显示全部楼层
学些学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-29 00:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表