为什么新的string(“”)编译而char c =“'不?

为什么空string有效,空字符不是? 我会想到一个空的string不是一个string,而只是一个占位符。 同样的字符,但创build一个空字符甚至不编译。

我想知道为什么会发生以下情况 – 编译 –

String s = ""; 

不编译 –

 char c = ''; 

因为char表示单个字符,而不是。 一个string可以包含零个或多个字符,但是一个字符不能是除单个字符以外的任何字符。

因为string文字表示一个可能包含零或多个字符的string,但(有效)字符文字只能表示一个字符。


一个字符可以被定义为一个数据types,可以存储0或1个字符…

是。 理论上可以这样定义。 但是请相信我,如果你考虑过所有的问题(比如你如何expression一个空的字符,应用程序如何处理这个问题等等),那么你就会得出结论,没有什么好处,而且有很大的缺点。

无论如何,这样做只是为了使String和char文字之间的语法一致性完全是疯狂的。 您不会破坏语言的性能和/或语义,因此语法看起来不错。


对接受的答案的一个评论提出''应该与'\0'相同。 但是对此的反驳是'\0'并不意味着没有字符。 这意味着一个值为零的字符。 所以如果'' 实际上是指一个angular色是误导性的。 而且,既然已经有一种表示这种… '\0'的方法了……表示它的第二种方式是多余的。

如果某些新的语言语法既误导又冗余,那么添加它就很困难。

为了避免SoloBold的评论,虽然可以定义一个字符types来做到这一点,但是需要更多的空间。 至less1位,更可能是16位,以避免内存alignment问题。 一个32位的chartypes是不可接受的,即使它解决了其他问题。

""是一个空的字符数组。

''根本不是一个人物。

一个空的string就像一个什么都不容纳的容器。 一个char必须有一个值,没有一个字符没有从哪里得到的值。

你可以看到一个String作为一个字符序列。 有一个没有字符的空序列是有道理的,拥有一个不是字符的字符不是。

也不要使用String s = new String(""); ,只是String s = ""就够了。

在math上,字母A是一组符号,假设字母A = {a,b,c,d,…,z}。 stringL是从字母表开始的零个或多个字符的序列,即L = A *。 一个空string就是一个零字符序列。 而“空字符”不是字母表的成员。

你不能有一个空的人物,这是不合逻辑的。

char是一个原始types,所以你需要给一个值(不pipe它是什么)。 如果你想让你的variables为“undefined”,你可以使用包装器对象:

 Character c = null; 

这样你variablesc不包含(还)任何值。 但是,一定要添加一个值! 🙂

顺便说一句,你可以使用对象包装的原始chartypes:

 Character c = null; Character c2 = 'a'; 

当你想要一个字段是“一个字符或什么都不是”时,这可能是有用的。

 String s = null; // OK String s = new String(""); // OK String s = new String("A"); // OK String s = new String("ABC"); // OK char c = 'A'; // OK char c = ''; // NOT OK! Character c = null; // OK Character c = new Character('A'); // OK Character c = new Character(''); // NOT OK! 

可能是因为char是一个原始types,而String是一个对象。 布尔值,int等也不允许“空”的值。

字符是单个字符,即字母,数字,标点符号,制表符,空格或类似的字符。

string是一组可以是0或更多的字符。 所以空string是有效的 – 没有任何字符。 BUt char表示字符的基本types,它必须是一个有效的字符,而不是。

我想你应该尝试了解空白字符/string和空字符/string之间的区别。 空白字符/string指的是具有一些内容的字符/string,比如''(SPACE),'\ t'等,而空字符没有任何内容,可以看作是一个空容器。