C++中的 NULL 和 Java 中的 null 有什么区别?

2022-09-02 05:14:55

我一直在试图弄清楚为什么C++让我疯狂打字。前几天突然袭击了我。多年来,我一直在Java中键入(小写)。突然间,我开始用C++编程,那一小块肌肉记忆让我发疯。NULLnull

Wikiperipatetic将C++ NULL定义为stddef的一部分:

展开为空指针常量的宏。它可以被定义为((void*)0),0或0L,具体取决于编译器和语言。

Sun的文档告诉我关于Java的“空文字”:

null 类型有一个值,即 null 引用,由文本 null 表示,该值由 ASCII 字符组成。空文本始终为空类型。

所以这一切都非常好。我知道什么是空指针引用,并感谢您的编译器注释。现在我对Java中文字的想法有点模糊,所以我继续阅读...

文本是固定值的源代码表示形式;文本直接在代码中表示,无需计算。

还有一个特殊的 null 文本,可用作任何引用类型的值。null 可以分配给任何变量,但基元类型的变量除外。对于空值,除了测试其是否存在之外,您几乎无能为力。因此,null 在程序中通常用作标记,以指示某些对象不可用。

好吧,所以我想我现在明白了。在C++ NULL 是一个宏,在编译时,其计算结果为空指针常量。在Java中,null是一个固定值,任何非原语也可以分配;非常适合在方便的测试中进行测试。if statement

Java没有指针,所以我可以理解为什么它们将null保持为一个简单的值,而不是任何花哨的东西。但是为什么java决定将所有大写的NULL更改为null呢

此外,我在这里错过了什么吗?


答案 1
  • NULL预处理器指令标识符,按照惯例,这些都应该是大写的。

  • null是表示常量值的语言垃圾,并且按照惯例应该全部较低(就像 or 一样)。truefalse


答案 2

Java的null更像是C++0x的nullptr。NULL 在 C++ 中仅为 0,最终可以解析为 int 而不是像您想要的指针。考虑:


void f(int);
void f(char*);

...

f(NULL); // which f()?

C++0x具有nullptr,它解决了这个问题,但它仍然不会完全等同于Java的null。他们只是不同的语言。

哦,另一个区别是Java没有指针(或者它这么说)。在Java中,您可以合法地将null分配给引用,C++如果不使用格式错误的构造,就无法做到这一点。诚然,如果没有这种能力,Java几乎毫无用处,但这绝对是另一个重要的区别。