if (p) 和 if (NULL != p) 那个效率高些?

CodeMagic 2006-12-19 04:11:23
rt
...全文
1072 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
amdk_7 2006-12-25
  • 打赏
  • 举报
回复
mark...一样一样!
weiym 2006-12-25
  • 打赏
  • 举报
回复
//效率上没什么差别

int main()
{
char* p=new char('a');
if(p!=NULL) *p='b';
if(!p) *p='c';
delete p;
return 1;
}

汇编代码如下:
int main()
{
00411C30 push ebp
00411C31 mov ebp,esp
00411C33 sub esp,0E8h
00411C39 push ebx
00411C3A push esi
00411C3B push edi
00411C3C lea edi,[ebp-0E8h]
00411C42 mov ecx,3Ah
00411C47 mov eax,0CCCCCCCCh
00411C4C rep stos dword ptr [edi]
char* p=new char('a');
00411C4E push 1
00411C50 call operator new (411546h)
00411C55 add esp,4
00411C58 mov dword ptr [ebp-0E0h],eax
00411C5E cmp dword ptr [ebp-0E0h],0
00411C65 je main+4Eh (411C7Eh)
00411C67 mov eax,dword ptr [ebp-0E0h]
00411C6D mov byte ptr [eax],61h
00411C70 mov ecx,dword ptr [ebp-0E0h]
00411C76 mov dword ptr [ebp-0E8h],ecx
00411C7C jmp main+58h (411C88h)
00411C7E mov dword ptr [ebp-0E8h],0
00411C88 mov edx,dword ptr [ebp-0E8h]
00411C8E mov dword ptr [p],edx
if(p!=NULL) *p='b';
00411C91 cmp dword ptr [p],0
00411C95 je main+6Dh (411C9Dh)
00411C97 mov eax,dword ptr [p]
00411C9A mov byte ptr [eax],62h
if(!p) *p='c';
00411C9D cmp dword ptr [p],0
00411CA1 jne main+79h (411CA9h)
00411CA3 mov eax,dword ptr [p]
00411CA6 mov byte ptr [eax],63h
delete p;
00411CA9 mov eax,dword ptr [p]
00411CAC mov dword ptr [ebp-0D4h],eax
00411CB2 mov ecx,dword ptr [ebp-0D4h]
00411CB8 push ecx
00411CB9 call operator delete (4111EAh)
00411CBE add esp,4
return 1;
00411CC1 mov eax,1
}
Jedimaster 2006-12-25
  • 打赏
  • 举报
回复
一样的

NULL是Macro
htqx 2006-12-25
  • 打赏
  • 举报
回复

常量放在前面好恶心,现代编译器还检测不出这些语法小毛病么。

最好还是 if ( p ) 直接直观简洁。

NULL != p 首先,要读取NULL,想一秒钟后,知道这个是0, 然后读入 p ,不清楚是什么,先放入缓存, 分析 != ,!= 这个首先是一个复合运算符,拆分组合操作,知道是判断符,然后,根据习惯将p 和 NULL互换,思考是否可以互换而语义没有变化,确认。然后思考为何p要和0比较, 得出p是一个指针,而不是bool,然后确认p不等于0是什么意思,最后理解了整个代码。
jamiandy 2006-12-22
  • 打赏
  • 举报
回复
我们写程序一般都遵守高质量C/C++编程的规范
mayudong1 2006-12-20
  • 打赏
  • 举报
回复
为了可读性 选择p!=NULL
flyerhua 2006-12-20
  • 打赏
  • 举报
回复
哈哈,大家都说完了,我就顶一下吧
烂番 2006-12-20
  • 打赏
  • 举报
回复
楼上的说了,我就不废话了
这种雕虫小技,编译器都能编译出两种不同的结果,除非这编译器是你自己写的
mathe 2006-12-20
  • 打赏
  • 举报
回复
对编译器来说,两种写法没有任何区别
lengxuelf 2006-12-20
  • 打赏
  • 举报
回复
if (NULL != p)比if (p) 效率高比如说:i++和i=i+1就是后者高,这个类似
fengwwei 2006-12-20
  • 打赏
  • 举报
回复
楼主是不是打错了。。应该是比较 NULL ==p 和 if(!p)把
其实也就是比较 NULL ==p 和 p==NULL
我门要成习惯 把常量放前面
flyforlove 2006-12-20
  • 打赏
  • 举报
回复
写成if(NULL!=p)

优点
1.避免赋值误写。
2.指名p的类型是指针
3.明确的显示出这是个逻辑判断,即使不懂c特性的人都能看懂,代码易读性好。

dreamw 2006-12-20
  • 打赏
  • 举报
回复
好,我也学到啦
lockhall 2006-12-19
  • 打赏
  • 举报
回复
如果是BOOL行的用if(p)

如果是指针用if(NULL == P)

yisea123 2006-12-19
  • 打赏
  • 举报
回复
写个程序测试下看

#include "stdio.h"
#include "windows.h"

void main()
{
DWORD p;
DWORD *test;
test=&p;

LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;
double dfMinus;
QueryPerformanceFrequency(&litmp);

QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart;
if(test)
printf("---if(form1)---\n");
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;
dfMinus = (double)(QPart2-QPart1);
printf("%f\n",dfMinus);

QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart;
if(test!=NULL)
printf("---if(form2)---\n");
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;
dfMinus = (double)(QPart2-QPart1);
printf("%f\n",dfMinus);

}

编译环境VC6
从执行效果看
if(test)效率要比if(test!=NULL)低

m00ners 2006-12-19
  • 打赏
  • 举报
回复
个人感觉
if(p)效率要高一些
但if(NULL!=p)可读性好,可以看出p是指针
高质量C++/C编程指南里面也推荐后者。
knift1128 2006-12-19
  • 打赏
  • 举报
回复
看好if( p )比较不喜欢蝇头小技~~~可读性才是王道
sw1024 2006-12-19
  • 打赏
  • 举报
回复
如果是指针的话用 if (NULL != p) 比较好,两者效率上应该是没有差距的
huiminlee 2006-12-19
  • 打赏
  • 举报
回复
NULL !=p 清楚的表明p是指针
  • 打赏
  • 举报
回复
一样的
加载更多回复(4)

69,377

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧