我需要能够在c ++中区分NULL
和0
。
有没有办法使用===
运算符(例如标识运算符found in JavaScript)来表示c ++中NULL
和0
之间的区别?< / p>
答案 0 :(得分:32)
NULL
是预处理器宏,在预处理器运行时将直接替换为0。所以简而言之,没有。
答案 1 :(得分:32)
在C ++中不需要这样的运算符,因为没有内置类型能够以有意义的可区分方式存储这两个值。此外,C ++中不需要NULL
,因为您可以将0
替换为零NULL
。 Bjarne Stroustrup甚至建议完全避免NULL
:
在C ++中,NULL的定义是0,因此只有美学差异。 我更喜欢避免宏,所以我使用0. NULL的另一个问题是人 有时错误地认为它与0不同和/或不是整数。 在预标准代码中,NULL有时被定义为不适合的东西 因此必须/必须避免。这些日子不太常见。
答案 2 :(得分:15)
无差异 - NULL
需要定义为整数常量,其值为0
。通常选择整数类型与指针的大小相同,但这实际上不是必需的。在C中,它经常被定义为(void *)0
,但这在C ++中是而不是(在C中它是合理的,因为指向void的指针支持隐式转换为任何其他指针类型 - 但在C ++中是不允许的,所以如果将NULL
定义为指向void的指针,则必须将其转换为获取任何其他指针类型。)
当/如果您希望空指针可以与0
区分开时,您可能希望使用nullptr
。 nullptr
可以分配给任何指针类型的变量,但不可以分配给整数类型(例如int
,long
,{{1等等)
答案 3 :(得分:10)
我认为你问的是:
如果我有变量
x
,我该如何区分
x
包含数字0
- 醇>
x
缺少/没有值/空指针
C ++具有强类型变量,所以即使有一个变量,其中两个都是可能的也是不寻常的。但是,NULL值逻辑在数据库中很有用,所以让我们看一下在C ++中表示它的几种方法。
情况:在模板代码中检测到x == 0
,其中0
的含义不明确。
答案:使用类型特征来确定x
是否是指针(案例#2)(案例#1)。
if (is_pointer(x))
情况:p
是一个C风格的NULL值逻辑变量,它是指向数值的指针。
答案:测试指针是否为空。如果没有,您可以检查指向的对象。
if (p == NULL) { /* case 2 */ }
else if (*p == 0) { /* case 1 */ }
情况:v
是一个Win32 VARIANT,它是一个用于在脚本语言中实现变量的区别联合。
答案:检查辨别键。
if (v.vt == VT_EMPTY) { /* case 2a */ }
else if (v.vt == VT_NULL) { /* case 2b */ }
else if (v.vt == VT_I4 && v.lVal == 0) { /* case 1 */ }
else if (v.vt == VT_I2 && v.iVal == 0) { /* case 1 */ }
// and so on
情况:o
是NULL值逻辑的C ++ - ism表示,例如boost::optional
。
答案:这些用于空值逻辑的C ++类提供了一种检测缺失值的方法。 boost::optional<int>
的一个具体示例表明它的设计就像指针一样被访问:
boost::optional<int> o;
if (!o) { /* case 2 */ }
else if (*o == 0) { /* case 1 */ }
答案 4 :(得分:1)
一般来说,NULL
和0
在 C ++ 中都是一样的(两者都是空指针)。
我将假设您正在询问如何在 C ++ 中获得可以同时具有NULL
和0
值的整数类型,并且能够说出不同之处。
您可以使用boost::optional
:
boost::optional<int> val;
if(!val)
std::cout << "null" << std::endl;
else
std::cout << "val=" << *val << std::endl;
val = 0;
if(!val)
std::cout << "null" << std::endl;
else
std::cout << "val=" << *val << std::endl;
这应打印出null
和val=0
。
答案 5 :(得分:1)
实际上,这取决于您将NULL
或0
与...进行比较...如果您要比较整数,那么NULL
如果您要与0
进行比较地址0
将作为NULL
。
答案 6 :(得分:0)
NULL
是一个预处理程序宏,在编译开始之前它将立即由0
替换。
C ++没有Java的运算符===
。我能想到的最接近C ++的是一种伪等价关系,它使用JS ===
完成了同样的事情:
if (!(x > y) && !(y > x)) { /* ... */ }