Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;三重相等? 在C++中,我需要能够区分 null 和 0 。 有没有办法使用“==//>代码>运算符(例如身份操作符)来区分空NU/COD>和 0 < /代码> C++中?_C++ - Fatal编程技术网

C++;三重相等? 在C++中,我需要能够区分 null 和 0 。 有没有办法使用“==//>代码>运算符(例如身份操作符)来区分空NU/COD>和 0 < /代码> C++中?

C++;三重相等? 在C++中,我需要能够区分 null 和 0 。 有没有办法使用“==//>代码>运算符(例如身份操作符)来区分空NU/COD>和 0 < /代码> C++中?,c++,C++,null 是预处理器宏,当预处理器运行时,将直接用0替换。因此,简而言之,没有。没有差异。--NULL需要定义为一个值为0的整型常量。整数类型通常被选择为与指针大小相同,但实际上并不需要。在C中,它经常被定义为“代码>(空洞*)0 < /Cord>,但是在C++中是不允许的(C中是合理的,因为空指针)支持隐式转换到任何其他指针类型——但是在C++中,这是不允许的,所以如果 null 被定义为空指针,则必须将其转换为其他指针类型。 当/如果您想要一个与0不同的空指针时,您可能需要使用nullptr

<代码> null <代码>是预处理器宏,当预处理器运行时,将直接用0替换。因此,简而言之,没有。

没有差异。--NULL需要定义为一个值为
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
    将作为
    NULL

    NULL
    是一个预处理器宏,它将立即由
    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 */ }