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

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

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

唉,终于遇到了一个有关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排序哪个在前” 的相关文章

强势美元掀起货币风暴,卢布却成全球表现最佳货币,人民币贬值压力几何

强势美元掀起货币风暴,卢布却成全球表现最佳货币,人民币贬值压力几何

前摩根士丹利货币策略分析师Stephen Jen曾提出著名的“美元微笑曲线”:美元在经济不景气和繁荣时都会走强。如今,美元指数刷新20年新高,开启“微笑模式”,非美货币纷纷下挫。...

25分钟清理5吨货物,恢复道路通行,衢州高速人紧急救援超级给力

25分钟清理5吨货物,恢复道路通行,衢州高速人紧急救援超级给力

在25分钟内清理5吨货物是一个具有挑战性的任务,需要高效的工作流程和适当的设备。首先,要确保有足够的人手来完成这项任务。根据货物的类型和复杂性,可能需要更多的人手来协助清理工作。其次,使用适当的工具和设备可以提高清理效率。例如,使用叉车、输送带或吊车等设备可以快速移动和堆放货物。如果货物是散装的,可...

车开到半路坏了,想寻找道路紧急救援?

车开到半路坏了,想寻找道路紧急救援?

亲爱的车友们,大家好!作为一名车主,平时开车最担心的就是爱车出故障了,所以我们日常聊的话题也是预防为主,可是每天繁忙的工作、学习、生活总有预防不到位的时候,那么如果哪天真的需要道路救援了,我们该怎么办呢?今天我们就来聊聊这个话题。 首先我们...

4.0 高速公路应急管理

4.0 高速公路应急管理

应急(突发事件)管理,重点在一个字“急”, 救人与抢通是应急防灾的首要目标。 首要是,救人(救援) “为了生命、与死神赛跑!” 再者是,抢通(保畅)道路 “国家的大动脉不能断!” 核心原则:快速反应、有效处置为什么救援时间非常宝贵?突发事...

剑网3星源冠军盒子发布!玩家称太丑:你们是不是和俱乐部有仇?

剑网3星源冠军盒子发布!玩家称太丑:你们是不是和俱乐部有仇?

侠士们好,在下万花信使。复工的这两天,不知道侠士们有没有回到过年前的状态呢?俗话说得好,体验过不上班的日子就再也不想上班了,谁不想舒舒服服在家躺平呢是吧。然而没办法大家都被生活推着走,眼看着剑三的新外观又要上架了,有没有侠士想给儿子闺女来件新衣服新发型呢?这不,新鲜的冠军礼盒——星源盒子来...

香港汇丰银行开立个人账户攻略——无存款无理财

香港汇丰银行开立个人账户攻略——无存款无理财

原标题:香港汇丰银行开立个人账户攻略——无存款无理财 随着居民国际视野的逐渐扩大、自身财富实力的增强以及国家监管政策的开放,内地居民以港股投机为代表的香港理财投资需求也在快速增长。 作为理财的基本立足点,在香港拥有个人银行账户已成为必须。 与此同时,香港保险近年来...