C++;三重相等? 在C++中,我需要能够区分 null 和 0 。 有没有办法使用“==//>代码>运算符(例如身份操作符)来区分空NU/COD>和 0 < /代码> C++中?
<代码> null <代码>是预处理器宏,当预处理器运行时,将直接用0替换。因此,简而言之,没有。没有差异。--NULL需要定义为一个值为C++;三重相等? 在C++中,我需要能够区分 null 和 0 。 有没有办法使用“==//>代码>运算符(例如身份操作符)来区分空NU/COD>和 0 < /代码> C++中?,c++,C++,null 是预处理器宏,当预处理器运行时,将直接用0替换。因此,简而言之,没有。没有差异。--NULL需要定义为一个值为0的整型常量。整数类型通常被选择为与指针大小相同,但实际上并不需要。在C中,它经常被定义为“代码>(空洞*)0 < /Cord>,但是在C++中是不允许的(C中是合理的,因为空指针)支持隐式转换到任何其他指针类型——但是在C++中,这是不允许的,所以如果 null 被定义为空指针,则必须将其转换为其他指针类型。 当/如果您想要一个与0不同的空指针时,您可能需要使用nullptr
0
的整型常量。整数类型通常被选择为与指针大小相同,但实际上并不需要。在C中,它经常被定义为“代码>(空洞*)0 < /Cord>,但是在C++中是不允许的(C中是合理的,因为空指针)支持隐式转换到任何其他指针类型——但是在C++中,这是不允许的,所以如果<代码> null <代码>被定义为空指针,则必须将其转换为其他指针类型。
当/如果您想要一个与
0
不同的空指针时,您可能需要使用nullptr
<代码> NulLPTR < /代码>可以被分配给任何指针类型的变量,但不能被赋给整数类型(例如,<代码> int <代码> >代码>长< /COD>,<代码> siZeIt < /Cuff>等) C++中的这种操作符不是必需的。因为没有内置类型能够以有意义的可区分方式存储这两个值。此外,C++中不需要<代码> null <代码>,因为您可以用零<代码> 0 < /代码>替换它。Bjarne Stroustrup甚至建议完全避免NULL
:
在C++中,NULL的定义是0,所以只有一个审美差异。
我更喜欢避免使用宏,所以我使用0。NULL的另一个问题是
有时错误地认为它不同于0和/或不是整数。
在前标准代码中,NULL有时被定义为不合适的和
因此必须避免。现在这种情况不太常见了
一般来说,
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;
boost::可选val;
如果(!val)
我想你问的是:
如果我有一个变量x
,如何区分
x
包含一个数字0
x
缺少/无值/空指针
C++有强类型变量,所以即使有一个同时具有这两种可能性的变量也是不寻常的。但是空值逻辑在数据库中是有用的,所以让我们来看看在C++中的几种表示方式。
情况:x==0
在模板代码中检测到,其中0
的含义不清楚。
回答:使用类型特征确定x
是否为指针(案例2)或非指针(案例1)
情况:p
是一个C风格的空值逻辑变量,它是指向数值的指针。
回答:测试指针是否为空。如果没有,则可以检查指向的对象
if (p == NULL) { /* case 2 */ }
else if (*p == 0) { /* case 1 */ }
情况:v
是一个Win32变体,它是一个用于在脚本语言中实现变量的有区别的联合体。
回答:检查识别键
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
是空值逻辑的C++-ism表示,例如boost::optional
。
这些值为空值逻辑的C++类提供了一种检测缺失值的方法。一个带有boost::optional
的特定示例显示,它的设计就像指针一样可以访问:
boost::optional<int> o;
if (!o) { /* case 2 */ }
else if (*o == 0) { /* case 1 */ }
boost::可选o;
如果(!o){/*情况2*/}
如果(*o==0){/*情况1*/}
实际上,这取决于您将什么与NULL
或0
进行比较……如果您将整数与NULL
进行比较,那么NULL
应作为0
工作,如果您与地址进行比较0
将作为NULLNULL
是一个预处理器宏,它将立即由0
开始编译之前
C++没有Javascript运算符==
。在C++中,我能想到的最接近的事情是一种伪等价关系,它用JS <代码>==< /代码>完成:
如果(!(x>y)和&(!(y>x)){/*…*/}
您能给出一个示例,说明如何首先执行此比较吗int*
和int
是两件完全不同的事情。为了让它们进行比较,你必须让它进行比较,这意味着你要想办法使这个比较变得模棱两可。C++不可能这样工作。这听起来像是你误用指针。使用<代码> NulLPTR <代码>代替<代码> null <代码>,问题解决了。参考我之前的注释:C++中不可能“区分<代码> null < /代码>和<代码> 0代码>代码,一般情况下,它们是完全相同的。如果你在谈论其他事情,你必须提供更多关于你正在尝试做什么的细节。NULL
不是大致定义为(void*)0
?@tadman:在C中是,在C++中,C++的NULL不是代码> 0 < /COD>或<代码> 0U>代码>或<代码> 0UL>代码>或<>代码> 0/Orth>——它特别需要具有一个整数类型。本质区别在于nullptr
没有隐式con
boost::optional<int> o;
if (!o) { /* case 2 */ }
else if (*o == 0) { /* case 1 */ }