将'NULL'分配给布尔数据类型是否可以接受?
答案 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 pointer
和null 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
/ 1
和false
/ 0
答案 12 :(得分:-1)
NULL不是定义0.我不知道,但可能有一些编译器对NULL使用非零值,或者甚至可能在其地址后面的thunk中设置一些标志。将您的代码移植到一个代码就好了。我只需我的运气,我就必须修复产生的错误。
所以我说,“不,它不可以接受。”