为NULL /假在C和C ++任何超过为0x0 / 0B0 / '\\ 0'/ 0

2019-07-23 06:34发布

这个问题已经在这里有一个答案:

  • 是什么“\ 0”和0 NULL之间的差异, 11解答

正如在问题中提到,我已经用NULL和假(在C ++)中可互换使用0或0x0和等。 我很好奇,想知道他们是否持有比是0同义词以外的任何特殊含义。

Answer 1:

对一些平台NULL0x0


从是NULL在C语言所需/定义为零? :

NULL保证是零,也许铸造到(void *) 1。

C99,§6.3.2.3,¶3

用的值的整数常量表达式0 ,或这样的转换为键入一个表达式void * ,被称为空指针常数。(55)如果一个空指针常数转换为指针类型,所得到的指针,被称为一个空指针,被保证比较不等的指针的任何对象或功能。

并注意55说:

55)宏NULL中定义<stddef.h>和其它标题)作为一个空指针常数。

请注意,因为如何对空指针的规则制定,使用分配/比较空指针的值保证是零,但实际上存储在里面的指针的位模式可以是任何其他东西(但据我所知只有少数极深奥的平台,利用这个事实,这不应该是一个问题,因为无论如何,以“看到”你应该去到下面的位模式UB -land反正)。


所以,至于标准而言,这两种形式是等价的( !ptr相当于ptr==0由于§6.5.3.3¶5和ptr==0相当于ptr==NULL ); if(!ptr)也相当地道。

话虽这么说,我平时写明确if(ptr==NULL)而不是if(!ptr)使之额外清楚,我检查无效,而不是一些布尔值的指针。


  1. 请注意,在C ++中void *投可以不存在由于严格的隐式转换规则,会做出这样的使用NULL繁琐(你必须明确地将其转换为每次比较指针的类型)。


Answer 2:

那么,NULL可能不是零,它只是一般为。 这取决于你的平台上-这里有一些讨厌的例子非零空机。



Answer 3:

NULL已经得到了广泛的含义中三分球。 最有可能宣布为NULL指针的东西,不能被引用,但只是可分配的东西。 而0或为0x0可以是可被两个参考和指定的指针的值。



Answer 4:

一般来说,在C++ ,你不应该使用NULL 。 在CNULL是一个宏(void*)0 ,而在C++ ,你应该使用0 ,而不是NULL 。 但你不能使用false ,而不是0的三分球! 除此之外,其实都是一样的,有时会造成混乱。
这就是为什么在C++11一个nullptr被定义为使用为指针。



Answer 5:

在C和历史性C ++, NULL必须是一个零值的整数常数,典型地0 。 我认为C可以包括一个明确铸造到void* ,但C ++不能因为这种语言不允许从隐式转换void*到其他指针类型。

在现代C ++中,它可以是nullptr代替。

在两种情况下,任何零值的整数常数(包括古怪诸如'\0'false )可转化为空指针值。



Answer 6:

从linux内核STDDEF.H

#define NULL ((void *)0)

enum {
        false   = 0,
        true    = 1
};

因此,它不完全是false

尽管这个帖子声称它是NULL0x0false几乎是相同的。



文章来源: is NULL/false in C and C++ anything more than 0x0 / 0b0 / '\\0' / 0 [duplicate]
标签: c++ c null