Почему новая строка ("") компилируется, а char c = " нет?


почему пустые строки допустимы, а пустые символы нет ? Я бы подумал, что пустая строка-это не строка, а просто заполнитель. То же самое для символа, но создание пустого символа даже не компилируется.

что им интересно, почему происходит следующее - Составляет -

String s = "";

не компилируется -

char c = '';
13 53

13 ответов:

, потому что char представляет собой один символ, который

потому что строковый литерал представляет собой строку, которая может состоять из ноль или больше символы, но (допустимый) символьный литерал представляет ровно символ.


символ может быть определен как тип данных, который может хранить 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' и т. д., В то время как пустые не имеют никакого содержимого и могут рассматриваться как пустой контейнер.