C ++三等于?

时间:2013-05-10 18:27:50

标签: c++

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

有没有办法使用===运算符(例如标识运算符found in JavaScript)来表示c ++中NULL0之间的区别?< / p>

7 个答案:

答案 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区分开时,您可能希望使用nullptrnullptr可以分配给任何指针类型的变量,但可以分配给整数类型(例如intlong,{{1等等)

答案 3 :(得分:10)

我认为你问的是:

  

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

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

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

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

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

    if (p == NULL) { /* case 2 */ }
    else if (*p == 0) { /* case 1 */ }
    
  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
    
  4. 情况: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)

一般来说,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

答案 5 :(得分:1)

实际上,这取决于您将NULL0与...进行比较...如果您要比较整数,那么NULL如果您要与0进行比较地址0将作为NULL

答案 6 :(得分:0)

NULL是一个预处理程序宏,在编译开始之前它将立即由0替换。

C ++没有Java的运算符===。我能想到的最接近C ++的是一种伪等价关系,它使用JS ===完成了同样的事情:

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