我知道你应该在c ++中使用0
而不是NULL(尽管大多数时候NULL
在C ++中被定义为0
。
最近我遇到了一些使用0x0
的代码。
有什么区别?
答案 0 :(得分:27)
0x0
仅以{十六进制表示法编写0
。两者之间没有区别:
0 16 = 0 10 :)
NULL
通常#define
d到0
某处并执行同样的操作。
答案 1 :(得分:17)
没有区别。在C中,NULL通常被定义为(void *)0
,但在C ++中是不允许的。一些古老的编译器错了,但它们确实很古老。
IMO,最好使用NULL,因为它可以更清晰地描绘 intent ,并在编译器更新为C ++ 0x时为S& R提供一个漂亮,简单的符号,其中包括nullptr
。
答案 2 :(得分:6)
顺便说一句,大家,
0x0是十六进制,正如你所提到的那样,但是
0是八进制,而不是十进制! : - )
即任何以0开头(而不是后跟x)的数字都是八进制:
0 = 0 01 = 1 02 = 2 ... 07 = 7 010 = 8 011 = 9 012 = 10 ...
: - )
答案 3 :(得分:5)
0x0
和0
代表相同的值,因此您可以使用最适合您眼睛的值。当我们得到C ++ 0x时,我们将使用关键字nullptr
来表示任何类型的空指针。
答案 4 :(得分:2)
0x0只是十六进制值0的表达式。我怀疑编译器会关心它的区别。
答案 5 :(得分:2)
没有区别
在我看来,0x0更明确。
有些人可能会混淆0和“0”(0x30 - 我已经看到它发生了)。
答案 6 :(得分:0)
简单地说,这是一个品味问题。人们喜欢用十六进制来写内存地址,所以将NULL写为0x0会更经典。对于像我这样的普通人来说,0就足够了。
答案 7 :(得分:-7)
所以,这个网站有一些非常好的关于NULL的信息:http://c-faq.com/null/index.html
NULL实际上是“空指针” - 因此它可能是类型,例如“(void *)0”。这告诉编译器NULL不被视为int,而是作为“指向int的指针”。在C中,如果类型不匹配,编译器将发出警告/错误。
值“0”和“0x0”在C ++中是等效的。只要数字以“0x”为前缀,就意味着该值是该数字的十六进制表示。例如,0x5 == 5.
另外,0xA [十六进制,基数为16] == 10 [基数为10]。
修改强>
以下是一些消息来源。在glibc中,NULL似乎在不同的地方定义不同。 (为什么会这样?)
#define NULL ((void *)0)(stdlib / gmp-impl.h)
#define NULL 0(posix / getopt1.c)
<强> EDIT2 强>
好吧,看起来我错过了这个标记!抱歉! (CW'd。随时保持低调!)