判断指针是否为空_判断指针是否为空指针的函数-程序员宅基地

技术标签: C/C++  语言  汇编  c  null  测试  object  

这两天一直迷惑一个问题,就是如何判断指针是否为空,通常有如下两种方式(假设p为指针):

if (NULL == p) {
    
    // ...
}
if (!p) {
    
}

到底哪种方式好呢?这个问题应该从两个方面去考虑,本文就是围绕这两个问题展开的,仅限于C语言。
它们在语义、编译等环节上是否等价?
它们在可读性、可维护性等上面是否等价?

一、是否存在隐式类型转换?

《C 程序设计语言中》规定(中文第二版177页),对于运算符==和!=,可以作如下比较:指针可以和值为0的常量表达式或指向void的指针进行比较。而NULL在C中被定义为((void*)0),故NULL == p可以直接进行。

而175页也同时规定,运算符!的运算分量必须是一个算术类型或指针。如果运算分量等于0,那么结果为1,否则结果为0。结果类型为int。

由上面的分析可以看出,上述两个条件判断都不需要进行隐式类型转换。同时,我也在VC2008下面测试了一下,这两种情况下的汇编都为如下形式:

   1: 00971578  cmp         dword ptr [p],0 
   2: 0097157C  jne         test1+0A3h (971583h) 

更深一步的讲,C99规范对运算符==和!也是有规定的,和《C 程序设计语言中》描述一致。第6.3.5节,第5点明确表示!E和0==E等价。参见下面的具体描述:
5 The result of the logical negation operator ! is 0 if the value of its operand compares
unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int.
The expression !E is equivalent to (0==E).

第6.5.9节中规定==两边的操作数,可以一边是指针,一边是指向void类型的指针;或者,一边是指针一边是空指针常量。参见下面的具体描述:
— one operand is a pointer to an object or incomplete type and the other is a pointer to a
qualified or unqualified version of void; or
— one operand is a pointer and the other is a null pointer constant.

二、可读性

《C 程序设计语言中》中文第二版32-33页讲到运算符!时,建议使用!p而不要使用p == 0。但同时又提到在复杂的情况下可能难于理解。个人认为,!p的方式可以使代码更短,看起来简洁,NULL == p总觉得怪怪的。

三、结论

通过上面的分析,可以看到,这两种方式没有本质的区别。具体选哪种方式,一要看具体的逻辑表达式,而是要看代码可读性如何。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chenyufei1013/article/details/6193295

智能推荐

学无止境的CSS(xHTML+CSS技巧教程资源大全)_永远学不完的css-程序员宅基地

文章浏览阅读423次。在这里先感谢帕兰映像,各位读者瞪大眼睛准备好哦,以下是原文: 我总是对每一个想学CSS的朋友说: “学CSS真的很简单,一个星期就搞定。” 但真的这么简单吗?魔方也很简单,拿到手里就知道怎么玩了,但最高境界却不是几天或几个月就能修成的,甚至根本就不可能达到,永远需要提高,看似痛苦,同时也享受升华的乐趣,CSS也一样,痛并快乐指的就是这些东西吧。 本文里面收集一些有关CSS的技巧、教程、工具和观点等_永远学不完的css

数字化转型工具很重要,比工具重要的是选择,3个思路带你选对BI_bi決策分析 數位轉型的關鍵議題與挑戰-程序员宅基地

文章浏览阅读224次。据国家医保局最新消息,覆盖13.6亿参保人全国统一医保信息平台全面建成。实现医保业务编码标准统一、数据规范统一、经办服务统一,实现国家、省、市、县四级医保信息互联互通、数据有序共享,医保与多部门和医疗机构、药店等单位的信息共享。将在全国31个省份和新疆生产建设兵团全域上线,为参保人提供医保服务,医保信息化标准化取得里程碑式突破。随着医保信息平台的全面建成,越来越多的人主动或者被动的参与到了全民数字化的建设之中。人们也发现,当今数据的地位在不断的攀升,从一开始企业尝试利用数字化,到后来的企业重点建设数字化_bi決策分析 數位轉型的關鍵議題與挑戰

poi创建生成excel样式汇总_poi生成表格样式-程序员宅基地

文章浏览阅读729次。这里需要注意poi的版本问题版本不同,代码不同,不过大同小异XSSFWorkbook和HSSFWorkbook 的样式上也有一定的区别先上两个常用的POI的pom依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.10_poi生成表格样式

【IAR工程】STM8S208RB基于ST标准库下按键检测_stm8库开发的输入模式怎么检测-程序员宅基地

文章浏览阅读442次。【IAR工程】STM8S208RB基于ST标准库下按键检测_stm8库开发的输入模式怎么检测

康耐视智能相机Insight与四轴,六轴工业机器人视觉引导定位配合详细方法与步骤_康耐视的视觉引导项目集合-程序员宅基地

文章浏览阅读1k次。康耐视智能相机Insight与四轴,六轴工业机器人引导定位配合详细方法与步骤_康耐视的视觉引导项目集合

树莓派Debian系统中如何用mDNS广播自己的ip地址_avahi怎么广播-程序员宅基地

文章浏览阅读735次,点赞6次,收藏7次。在 Debian 系统的树莓派上使用 mDNS(Multicast DNS)广播其 IP 地址通常涉及到 Avahi 服务的使用。请注意,其他设备要能通过 mDNS 解析你的树莓派主机名,它们需要支持 mDNS 或者安装了相应的软件(如 Windows 下的 Bonjour 服务)。通过以上步骤,你的树莓派应该能够使用 mDNS 向局域网内的设备广播其 IP 地址和主机名了。你可以将其改为你想要的名称,然后保存并关闭文件。为你树莓派的主机名。如果解析成功,它应该能够返回树莓派的 IP 地址。_avahi怎么广播

随便推点

基于S. Bancroft 方法多点定位代数 GPS 方程附matlab完整代码_matlab 多点定位-程序员宅基地

文章浏览阅读158次。由于目标信号的发射时间未知,无源定位技术大多利用TDOA(到达时间差)进行目标定位.本文将求解GPS单点定位的Bancroft算法。_matlab 多点定位

python高手之路 pdf百度云,python高手到什么水平-程序员宅基地

文章浏览阅读336次,点赞9次,收藏8次。大家好,本文将围绕python高手修炼之道pdf下载展开说明,python高手之路 pdf百度云是一个很多人都想弄明白的事情,想搞清楚python高手到什么水平需要先了解以下几个事情。在 2017年LinuxIDC.com/4月/Python教程PDF合集下载/Python的UNIX和Linux系统管理指南.pdf。Python绝技运用Python成为顶级黑客.pdf。Python编程入门第3版高清扫描文字版.pdf。Python编程实战运用设计模式.pdf。Python袖珍指南第5版.pdf。

基于区块链的内容社交平台,他们凭什么说比知乎更吸引人?-程序员宅基地

文章浏览阅读2.6k次。本堂茜 渡鸦区块链专栏记者 张杰拥有10多年的软件开发经验和创业经验,自称是“互联网老兵,区块链新秀”。随着互联网的发展,渐渐的他们不再满足于做线下的软件外包项目,更想在互联网方面做。 他们在互联网方面做了很多SAAS服务。例如为电信所做的大数据展示项目,通过大数据在大屏幕实时观测人口密度,如果一旦超过预警,部队警察便可以开始出动,采取进行相应疏导限流对策,以防止_区块链聊天 知乎

美国Gartner权威报告揭露华为技术(18个)实力有多强?_gartner 报告 权威吗-程序员宅基地

文章浏览阅读1.6k次。其实,华为技术不仅仅是聚焦运营商BG,还有企业BG、消费者BG(大家最熟悉的手机等终端业务)和公有云BU。关于华为技术如何,最近网上纷纷攘攘,各种说辞应有尽有。由于我对华为企业BG相对比较熟,所以只能站在企业角度,通过拿美国第三方咨询机构Gartner报告来谈谈,尽量通过第三方机构来证明,可能更具有说服力。简单说说Gartner象限,Gartner魔力四象限主要从执行力和技术前瞻性两个维度..._gartner 报告 权威吗

文献管理软件Mendeley基本使用教程-程序员宅基地

文章浏览阅读1.9w次,点赞9次,收藏48次。文献管理软件是学者或者作者用于记录、组织、调阅引用文献的计算机程序_mendeley

springboot如何在拦截器中拦截post请求参数以及解决文件类型上传问题_spring 拦截处理请求参数-程序员宅基地

文章浏览阅读1k次。SpringBoot也是通过获取request的输入流来获取参数,这样上面的疑问就能解开了,为什么经过过滤器来到Controller请求参数就没了,这是因为 InputStream read方法内部有一个,postion,标志当前流读取到的位置,每读取一次,位置就会移动一次,如果读到最后,InputStream.read方法会返回-1,标志已经读取完了,如果想再次读取,可以调用inputstream.reset方法,position就会移动到上次调用mark的位置,mark默认是0,所以就能从头再读了。_spring 拦截处理请求参数

推荐文章

热门文章

相关标签