技术标签: 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总觉得怪怪的。
三、结论
通过上面的分析,可以看到,这两种方式没有本质的区别。具体选哪种方式,一要看具体的逻辑表达式,而是要看代码可读性如何。
原因是POM文件错误。看下仓库中具体报错的pom文件是不是不对。删掉这个报错的模块文件夹重新编译。如果还报错,再看一下重新下载的POM文件是不是还是错的。如果是就再删掉,换maven仓库地址。我的错误是因为阿里云中的spring-boot-parent-2.1.6.RELEASE.pom POM文件错误。我换其他仓库就好了。...
前言 在分布式系统中,每一个机器节点虽然能够明确知道自己在进行事物操作过程中的结果是成功或失败,但是却无法直接获取到其他分布式节点的操作结果。因此,当一个事物操作需要跨越多个分布式节点的时候,为了保持事物处理的ACID特性,就需要引入一个称为“协调者”的组件来统一调度所有分布式节点的执行逻辑,这些被调度的分布式节点则被称为“参与者”。协调者负责调度参与者的行为,并最终决定这些参与者...
其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或者损坏了,这时你只需下载这个OpenAL32.dll文件进行安装(前提是找到适合的版本),当我们执行某一个.exe程序时,相应的DLL文件就会被调用,因此安装好之后就能重新打开你的软件或游戏了.那么出现OpenAL32.dll丢失要怎么解决?
比较简单的基于matlab的测试程序,直接上代码%函数功能-学习实现马赫带效果%函 数 名:dstb—单色图斑%输出参数:sctu-输出效果图%输入参数:sb-图斑色别function [sctu]=dstb(sb) % clear all; cstb(1:256,1:256,1:3)=0; for II=1:16 for JJ=1:16 cstb(((II-1)*16+1):(II*1...
1.在加载前端js时,先加载下面方法$('.edit').editable({ imageUploadURL: base.domain +"NewSoft/ziliaoceshi.do",})在上面的代码中你看到imageUploadURL,imageUploadURL其实就是你处理该插件上传图片的后台方法地址,而不是你的图片要上传到的路径。下面贴出我的后台处理方法。2.后台...
Aop 即面向切面编程,而 Aspect 是Aop 思想的一种实现。并不是所有的AOP框架都相同,它们在连接点模型上可能有强弱之分,有些允许在字段修饰符级别的应用通知,有些只支持方法调用相关的连接点。需要注意的是 Spring 只支持方法级别的连接点。Spring 提供了4种类型的AOP支持基于代理的经典Spring Aop纯Pojo切面@Aspect注解驱动的切面注入式的Aspectj的切面。
我们日常工作很多时候都需要打印一些资料,但是不可能每台电脑都安装打印机,而且文件有时候也不是很方便传给别人打印,因此很多就会再局域网中设置打印机共享,但是设置共享之后会发现无法连接的情况,那共享之后无法连接该怎么办呢?我们一起来看一下怎么解决。设置共享打印机但是发现不能连接,我们应该怎么办呢?出现无法连接很多情况下是打印服务端的问题,下面我们介绍几种方法为您解决无法连接的问题。在一般的情况下如果我...
作者介绍史海峰,公众号IT民工闲话作者第79篇好文:11000字 | 18分钟阅读前言我今天不讲技术,主要分享作为IT民工最近十年的职业历程,希望能给...
一张图理解getWidth和getMeasuredWidth" title="Android 一张图理解getWidth和getMeasuredWidth" style="margin:0px; padding:0px; border:0px; list-style:none">view.getMeasuredHeight()可能隐藏在上头.可能在下头.如果view没有超出屏幕的时候vie
Metro UI 是一种界面展示技术,是 Windows 8 的主要界面显示风格。Metro界面和 iOS、Android 界面最大的区别在于:后两种都是以应用为主要呈现对象,而 Metro 界面强调的是信息本身,而不是冗余的界面元素。同时在视觉效果方面,这有助于形成一种身临其境的感觉。1. BootMetro基于 Twitter Bootstrap 的简单灵活的 HTML、CSS 和 Java...
Special Bean Types In the WebApplicationContextThe Spring DispatcherServlet uses special beans to process requests and render theappropriate views. These beans are part of Spring MVC. You can choose
javafx逻辑实现五子棋基本功能(悔棋,重新开始,保存棋谱,复盘,人人对战,单机模式)做这个项目,本身目的仅仅是想应用学过的知识做个小项目,想知道它们在实际开发中应该如何应用,顺便帮我对几个月来的学习的知识更深入的了解。等我学完了数据库,再做个更大的项目,应该不成问题。所以,这篇文章适合学完Java基础的人学习,这也是我对自己Java学习第一阶段做的总结。...