【发布时间】:2010-06-02 17:54:58
【问题描述】:
我一直在试图弄清楚为什么 C++ 让我疯狂地输入NULL。前几天它突然袭击了我;多年来,我一直在用 Java 输入 null(小写)。现在突然间我在用 C++ 编程,而那一小块肌肉记忆让我发疯了。
Wikiperipatetic 将 C++ NULL 定义为 stddef 的一部分:
扩展为空指针的宏 持续的。它可以定义为 ((void*)0), 0 或 0L 取决于 编译器和语言。
Sun 的文档告诉我关于 Java 的“空文字”:
null 类型有一个值,null 引用,由字面量表示 null,由 ASCII 组成 人物。空文字总是 null 类型。
所以这一切都很好。我知道空指针引用是什么,感谢您的编译器注释。现在我对 Java 中文字的概念有点模糊,所以我继续阅读......
文字是源代码 固定值的表示; 文字直接表示为 您的代码无需 计算。
还有一个特殊的空字面量 可以用作任何值 参考类型。可以分配 null 到任何变量,除了变量 原始类型。你很少 可以处理超出的空值 测试它的存在。所以, null 通常在程序中用作 标记以指示某个对象是 不可用。
好的,我想我现在明白了。在 C++ 中,NULL 是一个宏,它在编译时计算为空指针常量。在 Java 中,null 是一个固定值,也可以分配任何非原始值;非常适合在方便的 if statement 中进行测试。
Java 没有指针,所以我可以理解为什么它们将 null 保留为一个简单的值,而不是任何花哨的值。 但是为什么 java 决定将所有大写的 NULL 改为 null?
此外,我这里有什么遗漏吗?
【问题讨论】:
-
“Java 没有指针”。实际上,Java only 有指针。
-
((void*)0)不是 C++ 中NULL的有效定义。 -
@Viktor Sehr:不正确。 Java没有指针。即使某些实现(甚至全部)决定通过物理指针来实现Java对象的概念,仍然不代表Java中的对象就是指针。
-
@AndreyT。 Java 对象显然不是指针。 Java 对象是 Java 对象。 @Viktor 的意思是不能将对象存储在变量中,而只能引用对象,这是真的。
-
我要把这个送给 Noah,但要对 aioobe 和所有回答或至少分享他们对大写的看法的人表示敬意。