社区
C语言
帖子详情
if (p) 和 if (NULL != p) 那个效率高些?
CodeMagic
2006-12-19 04:11:23
rt
...全文
1098
24
打赏
收藏
if (p) 和 if (NULL != p) 那个效率高些?
rt
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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是指针
珍惜生命远离CPP
2006-12-19
打赏
举报
回复
一样的
加载更多回复(4)
【MySQL】 IS NOT
NULL
和 !=
NULL
的区别?
上面第三个SQL插入的
NULL
是个字符串格式的
NULL
,对于MyISAM的存储引擎,测试的结果和上述结果是一样的。当字段上包含有索引时,由于B树索引是不会存储
NULL
值的,所以在使用这个字段做为查询条件时,对性能的影响还是...
null
!="" 常用的字符串非空判断
在使用数据库时碰到一个显示问题,一模一样的字段但是显示效果不一样,如下图,一个内容...后面想起做非空判断时经常是这么写的if(String!=
null
&&String="") 之前一直不明白为什么要这么写,碰到这个问题后终于明白了。
null
== obj 和 obj ==
null
在java中推荐前者的原因
if (
null
== obj) 而不是 if (obj ==
null
),之前不理解这样写有什么区别,后来才知道其实就是避免把 == 写成赋值 = ,因为如果是Obj =
null
IDE此时不会报错;而当你写成
null
= obj的话 IDE是会报错的,这里也算是...
if mybatis or test_mybatis中if test 可以使用== !=
null
'' and or 和括号()...
union all and z.sjssny >= '${pd.ssny}' …MyBatis中的OGNL教程 有些人可能不知道MyBatis中使用了OGNL,有些人知道用到了... 如果我们搜索OGNL相关的内容,通常的结果都是和Struts有关的,你肯定搜不到和MyBatis...
JS判断相等或者不等于(==、===、!=、!==)运算符
=(不想等) 比较两个操作数的值是否不相等 ===(全等) 比较两个操作数的值是否相等,同时检测它们的类型是否相同 !==(不全等) 比较两个操作数的值是否不相等,同时检测它们的类型是否不相同 在...
C语言
70,020
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章