C++三等于?

use*_*753 22 c++

我需要能够区分NULL0使用c ++.

有没有办法使用像===运算符这样的东西(比如JavaScript中的标识运算符)来区分 c ++ NULL0c ++ 之间的区别?

Ran*_*aul 32

NULL是预处理器宏,在预处理器运行时将直接替换为0.所以简而言之,没有.

  • 在Javascript中有一个`===`运算符这样的东西.他在问C++中的等价物是什么. (8认同)

das*_*ght 32

在C++中不需要这样的运算符,因为没有内置类型能够以有意义的可区分方式存储这两个值.而且,NULL在C++中不需要,因为你可以0随处更换零NULL.Bjarne Stroustrup甚至建议NULL完全避免:

在C++中,NULL的定义是0,因此只有美学差异.我更喜欢避免宏,所以我使用0. NULL的另一个问题是人们有时会错误地认为它与0不同和/或不是整数.在预标准代码中,NULL有时被定义为不适合的东西,因此必须/必须避免.这些日子不太常见.

  • +1这是问题的核心.在C++中,您可以使用类型检查来回答这个问题. (2认同)

Jer*_*fin 15

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

当/如果你想要一个可以区分的空指针0,你可能想要使用nullptr.nullptr可以被分配给任何指针类型的变量,但是可以被分配到的整数类型(例如,int,long,size_t,等等)

  • 在C中,`NULL`既可以定义为值为0的整数常量表达式(例如`0`),也可以定义为强制转换为`void*`(例如`((void*)0)`) .根据需要添加括号,以确保它是主表达式并避免运算符优先级问题.C++不允许`((void*)0)`形式. (6认同)
  • @tadman:在C中它是,在C++中没有.C++ NULL是"0"或"0u"或"0uL"或"0uLL" - 具体要求它具有整数类型. (3认同)
  • 应该提到*reason*C++不允许`NULL`被定义为`((void*)0)`是C++不允许`void*`被隐式转换为其他指针类型,如在C. (3认同)
  • 是不是`NULL`大致定义为`(void*)0`? (2认同)

Ben*_*igt 10

我想你要问的是:

如果我有变量x,我该如何区分

  1. x 包含数字 0
  2. x 缺少/没有值/空指针

C++具有强类型变量,所以即使有一个变量,这两个变量都是不可能的.但是NULL值逻辑在数据库中很有用,所以让我们看一下在C++中表示它的几种方法.

  1. 情况:x == 0在模板代码中检测到,其含义0不明确.
    答案:使用类型特征来确定是否x是指针(案例#2)(案例#1).

    if (is_pointer(x))
    
    Run Code Online (Sandbox Code Playgroud)
  2. 情境:p是一个C风格的NULL值逻辑变量,它是指向数值的指针.
    答案:测试指针是否为空.如果没有,您可以检查指向的对象.

    if (p == NULL) { /* case 2 */ }
    else if (*p == 0) { /* case 1 */ }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 情况: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
    
    Run Code Online (Sandbox Code Playgroud)
  4. 情况:o是一个C++ - ism表示NULL值逻辑,例如boost::optional.
    答:这些用于NULL值逻辑的C++类提供了一种检测缺失值的方法.一个特定的例子boost::optional<int>显示它被设计为像指针一样被访问:

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