社区
C语言
帖子详情
if (p) 和 if (NULL != p) 那个效率高些?
CodeMagic
2006-12-19 04:11:23
rt
...全文
1123
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)
Java空字符串与
null
的区别和判断字符串是否为空的方法
Java空字符串与
null
的区别 一、Java空字符串与
null
的区别: 1、类型
null
表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a =
null
; ""表示的是一个空字符串,也就是说它的长度为0。例如声明一个字符串String str = "" ; 2、内存分配 String str =
null
; 表示声明一个字符串对象
string中的
null
和“”
String str =
null
; 表示声明一个字符串对象的引用,但指向为
null
,也就是说还没有指向任何的内存空间;String str = ""; 表示声明一个字符串类型的引用,其值为""空字符串,这个str引用指向的是空字符串的内存空间; 在java中变量和引用变量是存在栈中(stack),而对象(new产生的)都是存放在堆中(heap): String str = new St...
【Java_基础】空串、空格串、
null
的区别
1、表示的区别 string str1 = ""; //空串 str1.length() 等于 0 string str2 = " "; //空格串 str2.length() 等于 1 string str3 =
null
; //
NULL
2、内存区别 "" :分配了一个内存空间 " " :分配了内存,其ASCII码值为32 nul...
Java——HashMap和HashTable的区别
为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取模预算时,不需要做除法,只需要做位运算。效率虽然提高了,但是。只做了一些简单的位处理。从而不至于把使用2的幂次方带来的效率提升给抵消掉。: 线程不安全,
效率高
。在多线程并发的环境下,可能会产生死循环,数据覆盖等问题。使得取得的位置更加分散,从而减少了。然而除法运算是非常耗费时间的,效率很低。值的低位相同的概率比较高,而计算位运算为了解决这个问题,的结构(增加,删除,修改元素),将会抛出。值来计算得到最终的位置。: 线程安全,效率低。
C语言
70,038
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章