将'NULL'分配给布尔数据类型是否可以接受?

4 c++ boolean

将'NULL'分配给布尔数据类型是否可以接受?

Joh*_*itb 11

从理论的角度来看,是的.但这是一件可怕的事情.

NULL 是一个空指针常量,分配给指针使其指向任何内容.

...
ptr = NULL; // now it points to no object anymore
...

// or ptr == 0
if(ptr == NULL) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果您对任何情况感兴趣,以下是对标准的引用.首先,空指针常量是(4.10/1)

空指针常量是整数类型的整数常量表达式(5.19)rvalue,其值为零.

然后,如果我们将空指针常量转换为bool?会发生什么?它的解释4.12/1如下:

算术,枚举,指针或指向成员类型的指针的右值可以转换为bool类型的右值.零值,空指针值或空成员指针值转换为false; 一个

(当它谈论rvalue它时,本质上意味着一个简单的值而不是那种类型的变量).

现在,究竟那个NULL?读18.1/4(注意在C中,空指针常量的定义不同.这可能是它明确引用C++的原因)

宏NULL是本国际标准中实现定义的C++空指针常量

该组合的重要部分是" A zero value ... is converted to false" 部分.的分配NULL到一个布尔变量将尝试转换NULL为布尔值.如上述段落所述,存在并且可以进行这种转换.

关于空指针要理解的另一个重要的事情是a null pointer和a 之间的不同null pointer constant.正如我们刚刚读到的那样,空指针常量是一个零的整数值.但是,a null pointer和它的值a null pointer value是指针,它们的类型是指针类型.以下类型为int,并且是一个空指针常量

#define NULL ('n'-'n') // looks suspicious, but conforms
Run Code Online (Sandbox Code Playgroud)

因为它是一个整数常量表达式(基本上是一个在编译时已知的整数值),其值为零.以下是空指针值

(void*)NULL
Run Code Online (Sandbox Code Playgroud)

但它不是空指针常量.但无论如何,空指针也会转换为bool,如上面的引用所示:" A .. null pointer value .. is converted to false".所以你一切都很好.

  • 马丁,的确这就是为什么我告诉他这样做很可怕:)但我想我应该告诉他为什么编译器可以接受它. (3认同)

dir*_*tly 5

从我的n2798副本:

18.1类型

3宏NULL是本国际标准(4.10)中实现定义的C++空指针常量

4.12布尔转换[conv.bool]

1算术,无范围枚举,指针或指向成员类型的指针的右值可以转换为bool类型的右值.零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true.类型为std :: nullptr_t的右值可以转换为bool类型的右值; 结果值为false.

所以,是的,你似乎可以做到这一点.


MSN*_*MSN 2

编译器不会拒绝它,因为 NULL 通常是 0 的预处理器 #define,并且 0 可转换为 NULL 和 false 的指针表示形式。