社区
C语言
帖子详情
if (p) 和 if (NULL != p) 那个效率高些?
CodeMagic
2006-12-19 04:11:23
rt
...全文
1072
24
打赏
收藏
if (p) 和 if (NULL != p) 那个效率高些?
rt
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
基于Web的酒店客房管理系统的设计与实现+论文+开题
if(oldPassword.equals(admin.get("password").toString())){ String sql="update t_admin set password=? where id=?"; db.update(sql, new Object[]{newPassword,admin.get("id")}); return renderData(true,"1",...
null
!="" 常用的字符串非空判断
在使用数据库时碰到一个显示问题,一模一样的字段但是显示效果不一样,如下图,一个内容是(
null
),一个什么都没写。 结果前段的显示效果不一样。 后面想起做非空判断时经常是这么写的if(String!=
null
&&String="") 之前一直不明白为什么要这么写,碰到这个问题后终于明白了。
JS判断相等或者不等于(==、===、!=、!==)运算符
等值检测运算符包括 4个,详细说明如表所示。 等值检测运算符 等值检测运算符 说明 ==(相等) 比较两个操作数的值是否相等 !=(不想等) 比较两个操作数的值是否不相等 ===(全等) 比较两个操作数的值是否相等,同时检测它们的类型是否相同 !==(不全等) 比较两个操作数的值是否不相等,同时检测它们的类型是否不相同 在相等运算中,应注意以下几个问题: 如果操作数是布尔值,则先转换为数值,其中false转为 0,true转换为 1。 如果...
C#空值和
null
判断
一、空值判断效率 string s = ""; if(s == ""){} if(s == string.Empty){} if (string.Is
Null
OrEmpty(s)) {} if(s !=
null
&& s.Length ==0) {} if((s+"").Length == 0){} 1,2最慢;3较快;4,5最快 1,2几乎没区别;4,5几乎没区别 二、空值...
(len = is.read(buffer)) != -1.md
(len = is.read(buffer)) != -1的原理详解 InputStream.read(buffer) 方法 在java中api文档有read()这几种方法 方法摘要 方法 作用 abstract int read() 从输入流中读取数据的下一个字节 int read(byte[] b) 将输入流中读取一定数量 并将其存储在缓冲区数组 b 中。 ...
C语言
69,377
社区成员
243,075
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章