Ran*_*aul 32
NULL是预处理器宏,在预处理器运行时将直接替换为0.所以简而言之,没有.
das*_*ght 32
在C++中不需要这样的运算符,因为没有内置类型能够以有意义的可区分方式存储这两个值.而且,NULL在C++中不需要,因为你可以0随处更换零NULL.Bjarne Stroustrup甚至建议NULL完全避免:
在C++中,NULL的定义是0,因此只有美学差异.我更喜欢避免宏,所以我使用0. NULL的另一个问题是人们有时会错误地认为它与0不同和/或不是整数.在预标准代码中,NULL有时被定义为不适合的东西,因此必须/必须避免.这些日子不太常见.
Jer*_*fin 15
有没有差别 - NULL需要被定义为一个整常数,其值为0.通常选择整数类型与指针的大小相同,但实际上并不是必需的.在C它经常被定义为(void *)0,但这不是用C不允许++(在C这是合理的,因为一个指向void支持的隐式转换到任何其他指针类型-但在C++中是不允许的,所以如果NULL被定义为一个指向void ,你必须将它转换为任何其他指针类型).
当/如果你想要一个可以区分的空指针0,你可能想要使用nullptr.nullptr可以被分配给任何指针类型的变量,但是可以不被分配到的整数类型(例如,int,long,size_t,等等)
Ben*_*igt 10
我想你要问的是:
如果我有变量
x,我该如何区分
x包含数字0x缺少/没有值/空指针
C++具有强类型变量,所以即使有一个变量,这两个变量都是不可能的.但是NULL值逻辑在数据库中很有用,所以让我们看一下在C++中表示它的几种方法.
情况:x == 0在模板代码中检测到,其含义0不明确.
答案:使用类型特征来确定是否x是指针(案例#2)(案例#1).
if (is_pointer(x))
Run Code Online (Sandbox Code Playgroud)情境:p是一个C风格的NULL值逻辑变量,它是指向数值的指针.
答案:测试指针是否为空.如果没有,您可以检查指向的对象.
if (p == NULL) { /* case 2 */ }
else if (*p == 0) { /* case 1 */ }
Run Code Online (Sandbox Code Playgroud)情况: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)情况: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)