c++三重等号
C++ triple equals?
我需要能够区分c++中的NULL
和0
。
是否有一种方法可以使用===
操作符(如在JavaScript中发现的身份操作符)来区分NULL
和0
在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
不同的空指针时,你可能想使用nullptr
。nullptr
可以被赋值给任何指针类型的变量,但是不能被赋值给整数类型(例如,int
, long
, size_t
等)
我想你问的是:
如果我有一个变量
x
,我如何区分
x
包含数字0
x
缺失/无值/空指针
c++有强类型变量,所以即使有一个变量同时具有这两种可能性也是不寻常的。但是空值逻辑在数据库中是有用的,所以让我们看一下在c++中表示它的几种方法。
-
情况:模板代码中检测到
x == 0
,其中0
的含义不清楚。
答案:使用类型trait来确定x
是否是指针(case #2)或不是(case #1)。if (is_pointer(x))
-
情况:
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++表示,如boost::optional
。
答案:这些用于空值逻辑的c++类提供了一种检测缺失值的方法。boost::optional<int>
的一个具体例子表明,它被设计成像指针一样被访问:boost::optional<int> o; if (!o) { /* case 2 */ } else if (*o == 0) { /* case 1 */ }
一般来说,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;
这应该打印出null
和val=0
。
实际上这取决于你比较的是NULL
或0
…如果你比较的是一个整数,那么NULL
应该作为0
工作,如果你比较的是一个地址0
将作为NULL
工作
NULL
是一个预处理器宏,在编译开始之前将立即被0
取代。
c++没有Javascript的===
操作符。在c++中,我能想到的与此最接近的是一个sort伪等价关系,它在JS ===
:
if (!(x > y) && !(y > x)) { /* ... */ }
- 毕达哥拉斯三重嵌套循环误解
- 遍历 std::set 中包含的所有三重不同值?
- 如何动态分配由三重指针到类的矩阵?
- 如何在C++中进行耗时的三重组合
- 删除BST节点:三重故障
- 启用中断时QEMU三重故障
- 如何修复我的 c++ 毕达哥拉斯三重查找器中的'access violation reading location'错误?
- 三重限制的正整数组合的非递归枚举
- 如何在三重运算符的帮助下通过最大值完成地图
- 三重继承,没有唯一的最终覆盖者
- C 避免使用三重指针
- 叮叮当当:"没有可用的目标与这三重兼容
- 复制一个三重嵌套容器
- 在 C 编程中可以有三重减号吗?什么意思
- 几何库中算法和数据的分离(需要三重调度?)
- 为什么我的三重对象被破坏了
- 三重与号"&&&"在C++中代表什么?
- 三重 AND("&& &")如何工作?
- 三重地图,包括2个关键点
- 解引用双指针、三重指针等等