c++三重等号

C++ triple equals?

本文关键字:三重 c++      更新时间:2023-10-16

我需要能够区分c++中的NULL0

是否有一种方法可以使用===操作符(如在JavaScript中发现的身份操作符)来区分NULL0在c++中的区别?

NULL是一个预处理器宏,在预处理器运行时将直接被0替换。总之,没有

在c++中不需要这样的操作符,因为没有内置类型能够以有意义的可区分的方式存储这两个值。此外,在c++中不需要NULL,因为您可以在NULL所在的地方用零0替换它。Bjarne Stroustrup甚至建议完全避免使用NULL:

在c++中,NULL的定义是0,所以只有美学上的区别。我更喜欢避免使用宏,所以我使用0。NULL的另一个问题是人们有时错误地认为它不同于0和/或不是整数。在标准之前的代码中,NULL有时被定义为不合适的东西因此必须避免。现在不太常见了。

没有区别——NULL需要定义为整型常量,值为0。整数类型通常被选择为与指针相同的大小,但实际上并不是必需的。在C中,它经常被定义为(void *)0,但在c++中不允许(在C中,这是合理的,因为指向void的指针支持隐式转换到任何其他指针类型——但在c++中,这是不允许的,所以如果NULL被定义为指向void的指针,你必须强制转换它以获得任何其他指针类型)。

当/如果你想要一个与0不同的空指针时,你可能想使用nullptrnullptr可以被赋值给任何指针类型的变量,但是不能被赋值给整数类型(例如,int, long, size_t等)

我想你问的是:

如果我有一个变量x,我如何区分

  1. x包含数字0
  2. x缺失/无值/空指针

c++有强类型变量,所以即使有一个变量同时具有这两种可能性也是不寻常的。但是空值逻辑在数据库中是有用的,所以让我们看一下在c++中表示它的几种方法。

  1. 情况:模板代码中检测到x == 0,其中0的含义不清楚。
    答案:使用类型trait来确定x是否是指针(case #2)或不是(case #1)。

    if (is_pointer(x))
    
  2. 情况:p是c风格的空值逻辑变量,它是指向数值的指针。
    答:测试指针是否为空。如果没有,可以检查指向的对象。

    if (p == NULL) { /* case 2 */ }
    else if (*p == 0) { /* case 1 */ }
    
  3. 情况: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
    
  4. 情况:o是空值逻辑的c++表示,如boost::optional
    答案:这些用于空值逻辑的c++类提供了一种检测缺失值的方法。boost::optional<int>的一个具体例子表明,它被设计成像指针一样被访问:

    boost::optional<int> o;
    if (!o) { /* case 2 */ }
    else if (*o == 0) { /* case 1 */ }
    

一般来说,NULL0 c++ 中是一样的(都是空指针)。

我假设你问的是如何在 c++ 中获得一个可以同时具有NULL0值的整型,并且能够区分它们。

你可以使用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;

这应该打印出nullval=0

实际上这取决于你比较的是NULL0…如果你比较的是一个整数,那么NULL应该作为0工作,如果你比较的是一个地址0将作为NULL工作

NULL是一个预处理器宏,在编译开始之前将立即被0取代。

c++没有Javascript的===操作符。在c++中,我能想到的与此最接近的是一个sort伪等价关系,它在JS ===:

中完成了同样的事情。

if (!(x > y) && !(y > x)) { /* ... */ }