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

时间:2009-03-16 17:27:19

标签: c++ boolean

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

13 个答案:

答案 0 :(得分:10)

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

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

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

// or ptr == 0
if(ptr == NULL) {
    ...
}

如果您对任何案件感兴趣,以下是对标准的引用。首先,空指针常量是(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赋值给bool变量将尝试将NULL转换为布尔值。如上述段落所述,存在并且可以进行这种转换。

要理解的空指针的另一个重要事项是null pointernull pointer constant之间的差异。正如我们刚刚读到的那样,空指针常量是一个零的整数值。但是,null pointer及其值null pointer value是指针,它们的类型是指针类型。以下是int类型,是一个空指针常量

#define NULL ('n'-'n') // looks suspicious, but conforms

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

(void*)NULL

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

答案 1 :(得分:5)

来自我的n2798副本:

  

18.1类型

     

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

  

4.12布尔转换[conv.bool]

     

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

所以,是的,你似乎可以这样做。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

我的意见是,这会降低代码的可读性,但如果您愿意,请确定。毕竟NULL只是0。

答案 4 :(得分:1)

通常它会起作用,因为指针被设计为可在布尔上下文中使用:

int *i = NULL;
if (i) // This is a pretty acceptable use of pointer conversions to bool
{
   // never runs.
}

int *i = NULL;
...
bool b = i; // Maybe not so terrible, but you're better off just assigning to a pointer.

这是有目的的(请参阅dirkgently的标准参考答案)以允许这种用法。如果您使用以下语法:

bool i = NULL; // Don't do this
bool i2 = 0; // better
bool i3 = false; // Best

然后你可能会误导,但它会以便携,可预测的方式运作。将NULL定义为0,在这种情况下,您将获得false值,或者如果NULL确实是NULL指针,那么它也将计算为false。

答案 5 :(得分:1)

即使这在技术上是可行的,我也会避免它。 看起来如果你需要一个空值,你应该建模为不同于布尔值的数据类型。

如果您打算使用布尔值,请正确设计您的模块和代码以按设计使用它:具有两个潜在值,而不是三个。如果你需要三个,使用另一种数据类型,比如int或string,并且让这三个值中的每一个都意味着什么(在字符串中,空字符串意味着null)。

答案 6 :(得分:0)

不,您应该使用技术术语 - “找不到文件”

编辑:

参考:http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx

正确答案是否。

我认为你要做的是使用NULL来表示“未初始化”或“不知道”。这通常可以在数据库中使用,但不会始终在代码中工作,因为NULL的定义从预处理器到预处理器,语言到语言不等。

根据定义,布尔值是两个州的价值观。尝试将它们用作三态值是一个错误。在最好的情况下,这是一个肮脏的黑客,将来会引起其他开发人员的混淆,最糟糕的是它是一个突破性错误,只要你的构建链中的任何内容发生变化,就会让你陷入困境。

答案 7 :(得分:0)

我不确定你为什么要这样做。如果您正在尝试初始化它,请使用0.正如MSN所说,您的编译器不会拒绝它。也许您应该首先解释为什么要将bool设置为NULL?

答案 8 :(得分:0)

你可以这样做,但我不明白这一点。假设你有:

void* p = NULL;
bool b = p;

为什么不把它写成:

void* p = NULL;
bool b = (p != NULL);

它更清晰,任何体面的编译器都会生成相同的代码。

答案 9 :(得分:0)

NULL 在 C++ 中的意思是 Empty pointer,或者称之为 \0,“零指针”,“无”等等。
但这一切:它是一个数字 0-"ZERO"。
bool 的 0 表示 false - 所以它被接受。

但有时将 bool 设置为 NULL 可能不是您想要的:如果您想要一个特殊的 bool 包含值 true/false/undefine,称为 {{ 1}}。

答案 10 :(得分:-1)

只要false仍为0且NULL仍定义为0是,但这可能在将来发生变化。 我会说这是一种不好的做法,因为你混合概念并失去清晰度。

答案 11 :(得分:-1)

由于NULL通常不是0而是(void*)0,因此它在C ++中不起作用,因为在这种情况下NULL是一个指针。你必须做一个明确的演员:reinterpret_cast<bool>(NULL),这不是干净的。您应该使用true / 1false / 0

答案 12 :(得分:-1)

NULL不是定义0.我不知道,但可能有一些编译器对NULL使用非零值,或者甚至可能在其地址后面的thunk中设置一些标志。将您的代码移植到一个代码就好了。我只需我的运气,我就必须修复产生的错误。

所以我说,“不,它可以接受。”