C++ 是否可以指定';空';到布尔数据类型?

C++ 是否可以指定';空';到布尔数据类型?,c++,boolean,C++,Boolean,将“NULL”指定给布尔数据类型是否可以接受?编译器不会拒绝它,因为NULL通常是预处理器#定义为0,0可转换为NULL和false的指针表示形式。否,您应该使用技术术语“未找到文件” 编辑: 参考: 正确的答案是否定的 我认为您正在尝试使用NULL来表示“未初始化”或“还不知道”。这通常适用于数据库,但并不总是适用于代码,因为NULL的定义因预处理器和语言而异 根据定义,布尔值是两个状态值。尝试将它们用作三个状态值是错误的。充其量,这是一个肮脏的黑客行为,将来会给其他开发人员带来混乱;充其量,

将“NULL”指定给布尔数据类型是否可以接受?

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

否,您应该使用技术术语“未找到文件”

编辑:

参考:

正确的答案是否定的

我认为您正在尝试使用NULL来表示“未初始化”或“还不知道”。这通常适用于数据库,但并不总是适用于代码,因为NULL的定义因预处理器和语言而异


根据定义,布尔值是两个状态值。尝试将它们用作三个状态值是错误的。充其量,这是一个肮脏的黑客行为,将来会给其他开发人员带来混乱;充其量,这是一个破坏性的错误,一旦构建链中的任何内容发生变化,它就会从后面咬你。

只要false仍然为0,NULL仍然定义为0是,但这在将来可能会改变。
我认为这是一种不好的做法,因为你混淆了概念,失去了清晰性。

我的观点是,这会降低代码的可读性,但如果你想的话,这是肯定的。空值毕竟只是0。

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

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

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

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

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

如果您对任何情况感兴趣,请参阅本标准。首先,空指针常量是(
4.10/1

空指针常量是计算结果为零的整数类型的整数常量表达式(5.19)右值

然后,如果我们将空指针常量转换为
bool
,会发生什么?如
4.12/1
所述:

算术、枚举、指针或指向成员类型的指针的右值可以转换为bool类型的右值。零值、空指针值或空成员指针值转换为false;a

(当谈到
rvalue
时,它本质上是指一个简单的值,而不是该类型的变量)

现在,那实际上是什么?阅读
18.1/4
(注意,在C中,空指针常量的定义不同。这可能是它显式引用C++的原因)

宏NULL是在国际标准

中定义的C++空指针常数的实现。 该组合的重要部分是“
零值…转换为false”部分。将
NULL
赋值给bool变量将尝试将
NULL
转换为布尔值。正如上面的文章所说,这样的转换是存在的,并且是可以实现的

关于空指针另一个需要理解的重要内容是
null指针
null指针常量
之间的区别。正如我们刚才读到的,空指针常量是某个为零的整数值。但是,
null指针
及其值,
null指针值
是指针,其类型为指针类型。以下为int类型,是空指针常量

#define NULL ('n'-'n') // looks suspicious, but conforms
因为它是一个值为零的整型常量表达式(本质上是编译时已知的整数值)。以下是一个空指针值

(void*)NULL
但它不是空指针常量。但无论如何,空指针值也会转换为bool,正如上面的引文所述:“
A..null指针值..被转换为false
”。所以你们都很好

从我的n2798副本:

18.1类型

3,宏NULL是本国际标准(4.10)

中定义的C++空指针常数。 及

4.12布尔转换[conv.bool]

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


>是的,你可能能做到这一点。

< P>因为NULL通常不是0,而是<代码>(空洞*)0 < /C>,它在C++中不起作用,因为NULL是这种情况下的指针。您必须执行显式强制转换:
重新解释强制转换(NULL)
,不,这是不干净的。您应该使用
true
/
1
false
/
0

根据定义,NULL不是0。我不知道有什么,但可能有一些编译器使用非零值表示NULL,或者甚至在地址后面的thunk中设置一些标志。如果您的代码被移植到一个,那将是您的幸运。幸运的是,我必须修复由此产生的bug


所以我说,“不,这是不可接受的。”

一般来说,它可以工作,因为指针被设计为在布尔上下文中可用:

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

这样做是为了允许这种使用(参见Dirkgenty的标准参考答案)。如果使用此语法:

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

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

您可以这样做,但我看不出有什么意义。假设你有:

void* p = NULL;
bool b = p;
为什么不把它写成:

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

更清楚的是,任何一个像样的编译器都会生成相同的代码。

即使在技术上可以做到这一点,我也会避免它。 看起来,如果您需要一个空值,您应该为di建模
void* p = NULL;
bool b = (p != NULL);