Почему новая строка ("") компилируется, а char c = " нет?
почему пустые строки допустимы, а пустые символы нет ? Я бы подумал, что пустая строка-это не строка, а просто заполнитель. То же самое для символа, но создание пустого символа даже не компилируется.
что им интересно, почему происходит следующее - Составляет -
String s = "";
не компилируется -
char c = '';
13 ответов:
потому что строковый литерал представляет собой строку, которая может состоять из ноль или больше символы, но (допустимый) символьный литерал представляет ровно символ.
символ может быть определен как тип данных, который может хранить 0 или 1 символов ...
да. Теоретически это можно было бы определить именно так. Но поверьте мне, если вы продумаете все вопросы (например, как вы представляете пустой char, как приложение будет иметь дело с ним и т. д.) Вы придете к выводу, что есть несколько преимуществ и значительные недостатки.
в любом случае, делать это просто так что синтаксическая согласованность между строковыми и символьными литералами была бы совершенно сумасшедшей. Вы не нарушаете производительность и/или семантику языка, чтобы синтаксис выглядел красиво.
один комментарий к принятому ответу предполагает, что
''
должно означать то же, что''
. Но контраргумент заключается в том, что''
не означает отсутствие символов. Это означает один символ, значение которого равно нулю. Так что если''
на самом деле означает, что один символ вводит в заблуждение. И поскольку уже есть способ обозначить это ...''
... второй способ его обозначения избыточен.если какой-то фрагмент нового синтаксиса языка вводит в заблуждение и избыточен, его трудно оправдать.
в ответ на Солобольда комментарий, хотя для этого можно было бы определить тип символа, для этого потребуется больше места. По крайней мере, 1 бит, и, скорее всего, 16 бит, чтобы избежать неловких проблем выравнивания памяти. 32-битный
char
тип не будет приемлемо ... хотя это и решает другие проблемы.
пустая строка похожа на контейнер, который ничего не содержит. А
char
должно иметь значение, и без точно одного символа нет места, откуда можно получить это значение.
Вы можете видеть строку как последовательность символов. Наличие пустой последовательности без символов имеет смысл, наличие символа, который не является символом, не имеет смысла.
также никогда не используйте
String s = new String("");
, простоString s = ""
достаточно.
математически алфавит A представляет собой набор символов, предположим, алфавит A = {a, b, c, d,..., Зет.} Строка L-это последовательность из нуля или более символов алфавита, т. е. L = A*. Пустая строка-это просто последовательность нулевых символов; в то время как "пустые символы" не являются членом алфавита.
вы не можете иметь пустой символ, это нелогично.
char является примитивным типом, поэтому вам нужно дать значение (что бы это ни было). Если вы хотите оставить переменную как "неопределенную", вы можете использовать объект-оболочку:
Character c = null;
таким образом, переменная c не содержит (пока) никакого значения. Но тогда обязательно добавляйте ценность! :)
кстати, вы можете использовать обертку объекта для примитива
char
тип: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-это примитивный тип, А String-объект. boolean, int и др. также не допускайте "пустых" значений.
строка-это набор символов, которые могут быть 0 или более. таким образом, пустые строки действительны - которые не имеют никакого символа. Но char представляет собой примитивный тип символа, который должен быть одним допустимым символом, который " не является.
Я думаю, что вы должны попытаться узнать разницу между пустым символом/строкой и пустым символом/строкой. пустой символ / строка относится к символу/строке, который имеет некоторое содержимое, например ' '(пробел), '\t' и т. д., В то время как пустые не имеют никакого содержимого и могут рассматриваться как пустой контейнер.