C++ 是否可以指定';空';到布尔数据类型?
将“NULL”指定给布尔数据类型是否可以接受?编译器不会拒绝它,因为NULL通常是预处理器#定义为0,0可转换为NULL和false的指针表示形式。否,您应该使用技术术语“未找到文件” 编辑: 参考: 正确的答案是否定的 我认为您正在尝试使用NULL来表示“未初始化”或“还不知道”。这通常适用于数据库,但并不总是适用于代码,因为NULL的定义因预处理器和语言而异C++ 是否可以指定';空';到布尔数据类型?,c++,boolean,C++,Boolean,将“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);