我一直想弄清楚为什么C ++让我疯狂地打字NULL
。前几天它突然袭击了我;多年来我一直在Java中键入null
(小写)。现在我突然想用C ++编程,而那一小块肌肉记忆让我疯狂。
Wikiperipatetic将C ++ NULL定义为stddef的一部分:
扩展为空指针的宏 不变。它可以定义为 ((void *)0),0或0L取决于 编译器和语言。
Sun的文档告诉我关于Java的“null literal”:
null类型有一个值,null 参考,由文字表示 null,由ASCII组成 字符。始终是空文字 null类型。
所以这一切都非常好。我知道空指针引用是什么,并感谢编译器注释。现在我对Java中的文字的想法有点模糊,所以我继续阅读......
文字是源代码 表示固定值; 文字直接表示 你的代码没有要求 计算
还有一个特殊的空文字 可以用作任何值的值 参考类型。可以分配null 到任何变量,除了变量 原始类型。你没什么 可以使用null值 测试它的存在。因此, null经常在程序中用作 标记表示某个对象是 不可用。
好的,所以我想我现在就明白了。在C ++中,NULL是一个宏,在编译时,它将计算为空指针常量。在Java中,null是一个固定值,任何非基元也可以分配;非常适合在方便if statement
进行测试。
Java没有指针,所以我可以看到为什么它们保持null是一个简单的值,而不是任何花哨的东西。 但是为什么java决定将所有上限NULL
更改为null
?
此外,我在这里错过了什么吗?
答案 0 :(得分:23)
NULL
是一个预处理程序指令标识符,根据惯例,它们应该全部大写。
null
是一种语言文字,代表一个常量值,并且应该按照惯例全部更低(就像true
或false
)。
答案 1 :(得分:20)
Java的null更像是C ++ 0x的nullptr。 C ++中的NULL只是0,最终可以解析为int而不是像你想要的指针。考虑:
void f(int);
void f(char*);
...
f(NULL); // which f()?
C ++ 0x有nullptr,它解决了这个问题,但它仍然不会完全等同于Java的null。他们只是不同的语言。
哦,另一个不同之处在于Java没有指针(或者说它没有)。在Java中,您可以合法地为引用分配null,在C ++中,如果没有使用格式错误的构造,则无法执行此操作。不可否认,如果没有这种能力,Java就会毫无用处,但这绝对是另一个重要的区别。
答案 2 :(得分:6)
关于你的上一个问题,我不确定小写null背后的设计原理是什么, 但我认为目标是使null成为语言级文字(如真或假)而不是常量。
java中的关键字通常是小写的,因此命名为文字。常量(如Integer.MAX_VALUE)通常是大写的。
答案 3 :(得分:2)
使用0
代替NULL
。
由该语言的创建者Bjarne Stroustrup撰写的“The C ++ Programming Language”一书:
在C中,定义宏
NULL
以表示零指针已经很普遍。因为 C ++更严格的类型检查,使用普通0
而不是任何建议的NULL
宏,可以减少问题。如果您认为必须定义NULL
,请使用const int NULL = 0
;
答案 4 :(得分:2)
不,你已经得到了它。在C ++中,空指针是分配给指针的任何文字零值。 NULL
只是0
的一个宏,因此ptr = 0
和ptr = NULL
是相同的。它仅用于方便/可读性。它是大写的原因是因为在C和C ++中有一个长期惯例,宏的名称应该是大写的。
在Java中,null
是一个内置的文字,因为它不是宏(并且Java无论如何都没有宏的概念),所以没有令人信服的理由将其设为大写。
答案 5 :(得分:2)
Java null关键字用于将变量标识为不引用任何对象。无法将null关键字分配给使用基本数据类型声明的变量。 C ++ NULL值是一个定义为0的常量。
答案 6 :(得分:1)
在C ++中,NULL是一个宏,当时 编译后,定义空指针 恒定。
这是你弄错了。在C ++中,NULL为0,没有别的。指针和整数都可以为NULL。
另一方面,在java中,null是一个空指针,这意味着只有对象可以为null。
答案 7 :(得分:1)
Java没有指针,就像你自己说的那样,这就是为什么“null”的概念在Java和C ++之间是完全无法比拟的。
你的问题与“角度和苹果之间有什么区别”一样有意义,即除了显而易见的问题之外,它无法以任何其他方式回答:{+ 1}}在C ++中NULL
在Java中,有两个完全无关的概念。
Java从未“决定”将所有上限null
更改为NULL
,因为Java的null
再一次与C ++的null
无关。
答案 8 :(得分:0)
嗯,我不知道为什么java要求将NULL更改为null,但是大写更难以键入(至少在我的考虑中)。但你可能总是问太阳:-P。无论如何,说java没有指针是不完全正确的,因为java或c#中的普通引用或者像c ++中的refferences更像是指针。例如,在c ++中,引用不能为NULL,但java中的引用可以。并且c ++中的引用不能改变它所指向的变量(我可能在这一点上错了),但java引用可以。
答案 9 :(得分:0)
指针基本上是内存地址。并且只有一个众所周知且已建立的内存地址,0。c ++ NULL是大写的,因为它是一个预处理器宏,它们总是按惯例大写。指针概念直接映射到硬件中的地址空间概念。
Java使用引用,它有自己的内部表示方式。有一个众所周知的参考,null。它是小写的,因为它基本上是另一个符号,虽然指的是字面值。我不认为它们“改变”了从C到Java的任何东西。我认为他们只是想要null概念,所以他们称之为“null”。
在这两种情况下,null都允许函数返回其他信息。它可以返回结果的地址和可能操作不成功的事实。