判断指针是否为空
来源:互联网 发布:流水别墅模型数据 编辑:程序博客网 时间:2024/04/19 02:32
这两天一直迷惑一个问题,就是如何判断指针是否为空,通常有如下两种方式(假设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总觉得怪怪的。
三、结论
通过上面的分析,可以看到,这两种方式没有本质的区别。具体选哪种方式,一要看具体的逻辑表达式,而是要看代码可读性如何。
- 判断指针是否为空
- 判断指针是否为空
- 判断指针是否为空
- 空指针异常,java.lang.NullPointerException,判断是否为空
- 判断是否为空
- 判断是否为空
- 判断是否为空
- 判断表是否为空?
- 判断变量是否为空
- 判断DataSet是否为空
- 判断result是否为空
- 判断DataTable是否为空
- 判断文本框是否为空
- 判断dataset是否为空
- 判断数组是否为空
- 判断edit是否为空
- 判断String是否为空
- 判断目录是否为空
- taikonaut一词的由来
- 一年半的全文搜索总结
- Web开发人员必备的20款超赞的jQuery插件
- 《实现VM机与本机互ping》
- 免费ERP第五锤:免费让谁害怕?
- 判断指针是否为空
- Animation 动画模块分析
- ASP.NET 3.5(C#)系列3-新一代事务机制II-并发事务级别
- 程序员阿士顿的故事
- asp.net确认删除实现?
- MySQL中的mysqldump命令使用详解
- 什么是RFM模式
- Jquery 输入金额格式限制 插件
- 中小企业内部培训往往达不到目标原因分析