当前位置:首页 > 杂谈 > 正文内容

C/C++ 中 0 与 NULL 区别是什么?用 delete 时,用 p=0,还是用 p=NULL 好?为什么?-0和null排序哪个在前

2023-07-13 11:58:37TONY杂谈120

唉,终于遇到了一个有关NULL的问题,作为刚实现过编译器的nullptr的人士,对此还是有点儿感悟的,顺便吹吹牛,然后答完睡觉。

首先呢,要明白一点儿,NULL是一个无类型的东西,而且是一个宏。而宏这个东西,从C++诞生开始,就是C++之父嗤之以鼻的东西,他推崇尽量避免宏。而在他的FAQ中,也有相应的一个关于NULL与0的解释,也谈到了这一点儿。

C/C++ 中 0 与 NULL 区别是什么?用 delete 时,用 p=0,还是用 p=NULL 好?为什么?-0和null排序哪个在前

Stroustrup: C++ Style and Technique FAQ

在C++标准中,我们可以见到一个词语叫做null pointer constant,其实在C++11标准前,是只承认0为null pointer constant的。所以,在C++中,我们也经常能听到一个说法,就是赋予null pointer,应该是使用0,而非NULL。而nullptr pointer constant这个词语在C++11发布后,终于再添了一个成员,就是nullptr。而与NULL本质不同的是,nullptr是有类型的(放了在stddef头文件中),类型是 typdef decltype(nullptr) nullptr_t; 而正是因为是有类型的,这给我们编译器实现nullptr的时候带来了更多细节的考虑,当然也给了使用者更多的保障,所以如果你的编译器支持nullptr,请一定使用nullptr!

而nullptr的出现背景,其实是很简单的,C++哲学上来说就是C++之父一直对null pointer没有一个正式的表示感到非常不满,而更工程的来说,就是关于重载这个问题。

void f(void*) { } void f(int) { } int main() { f(0); // what function will be called? }

而引入了nullptr,这个问题就得到了真正解决,会很顺利的调到void f(void*)这个版本。

好了,真的以为nullptr就这样了么? 我前面说过了nullptr是有类型的,叫做nullptr_t,这给我们编译器实现带来了诸多要考虑的东西,不幸的话让我们来举点儿奇葩例子吧!

union U { long i; nullptr_t t; }; int main() { U u; u.i = 3; printf("%ld\n",(long)u.t); // What it is? 0 or 3? }

那么这是应该符合union语意还是nullptr的语意呢?这在标准中是没有说的,我们也为此争论了非常久。当然在我们编译器的实现还是保持了nullptr的语意,结果是0。

而nullptr有类型后,还能做什么呢?那当然就是可以捕获异常了。

int main() { try { throw nullptr; } catch(nullptr_t) { } }

你扔一个NULL试试?看他应该用什么收,正是因为没有类型,所以就要用它的本质类型,比如long什么的来说。你扔一个0试试?那就也不是所谓的空指针类型了,就是要用int什么的来收了。

所以,推崇nullptr是有道理的,我们在编译器实现nullptr的时候考虑了非常非常多的细节,还有很多你们可能一直用不到的情况,我们都要用来测试,目的就是保障开发者的使用。再次那句话,如果你的编译器支持nullptr,请一定使用nullptr!

最后再扯一点儿,0在C++是很神奇的东西。比如纯虚函数为什么是用=0来设置的,不知道有没有同学去考虑过这个问题没有。如果你深刻理解了C++哲学,这应该就是非常简答的问题了。学语言嘛,一定要学到其哲学,你才能知道其之美,其之威力,尤其是C++。

“C/C++ 中 0 与 NULL 区别是什么?用 delete 时,用 p=0,还是用 p=NULL 好?为什么?-0和null排序哪个在前” 的相关文章

有哪部电视剧你是一字不落看完的?为什么?

有哪部电视剧你是一字不落看完的?为什么?

战长沙 ,群像戏,没有绝对意义上的主角。正午阳光出品,豆瓣评分9.1。全员演技在线,现场收音,不侮辱观众智商的。 是我心中的电视剧第一。至今没有第二,可能是我看的电视剧太少了吧。战长沙完全不是抗战神剧。我是因为其中一个女演员去看的,出演的时...

同方全球【传世尊享】终身寿险——您值得拥有

同方全球【传世尊享】终身寿险——您值得拥有

导读 人生最大的风险就是来源于你不知道风险!人生需要规划,保障和储蓄都需要合理配置。很多人只有重疾险却不知道终身寿险,今天小编就告诉您什么是终身寿险以及终身寿险的意义········ 终身寿险的定义 什么终身寿险?终身寿险,是指不定期的死亡保险。保险合同订立后,被保...

公司不让用ToDesk了,这个年轻的远控软件真的安全么?

公司不让用ToDesk了,这个年轻的远控软件真的安全么?

很突然,公司下发通知不让用ToDesk了,这对于已经开始慢慢习惯远程办公的我来说,算是一记当头棒喝。 但班还得上啊,我着急忙慌的去问相关的同事,得到了下面的回复: 简直大无语,ToDesk不是号称很安全么?这是唱的哪一出?好奇心驱使我去查了一查。 首先同事...

云恒制造:PCBA板刷三防漆的几种方法

云恒制造:PCBA板刷三防漆的几种方法

PCBA板是电子产品中不可或缺的组成部分,它不仅需要具备良好的电路性能,还需要具有防水、防尘、防腐蚀等特性。在PCBA板的生产过程中,刷三防漆是必不可少的一环。运恒小编为大家介绍几种常见的刷三防漆方法。一、手工涂刷法手工涂刷法是最基础的PCBA板刷三防漆方法,适用于小批量、简单电路板的涂刷。具体步骤...

工行重庆自贸区分行:同心战“疫”守好金融服务保障线

工行重庆自贸区分行:同心战“疫”守好金融服务保障线

重庆本轮疫情发生以来,工行重庆自贸区分行党员、员工主动请缨,迎难而上,用实际行动筑牢金融抗疫防线。疫情期间,工行重庆自贸区分行即将退休的老党员廖霞主动请缨负责后勤保障工作,及时维护网点对外营业时间,确保对外公示与实际保持一致;及时处理印章流程,确保重点岗位人员通行证顺利办理。受疫情影响,许多客户只能...

“西瓜红”散落一地,高速“养护橙”紧急救援

“西瓜红”散落一地,高速“养护橙”紧急救援

货车剐蹭事故导致车上西瓜散落一地。 红网时刻新闻4月19日讯(记者陈奥男通讯员江巍)3月16日20时,湖南高速养护工程有限公司接到紧急通知,称张花高速青坪至茅岩河路段k35+000处左幅,发生一起货车...