2014-12-23 2 views
3

В C и C++ правила одинаковы. В C,Почему символьные константы/литералы не могут быть пустыми?

[§6.4.4.4]/2 Константа символов целого число представляет собой последовательность из одного или более многобайтовых символов, заключенных в одиночных кавычках, как и в 'x'.

В C++

[§2.14.3]/1 Символьный литерал представляет собой один или несколько символов, заключенные в одиночные кавычки, как в 'x', необязательно предшествует один из букв u, U или L, как в u'y', U'z', или L'x', соответственно.

Ключевая фраза "один или несколько". Напротив, строковый литерал может быть пустым, "", предположительно потому, что он состоит из символа нулевого завершения. В C это приводит к неудобной инициализации char. Либо вы оставите его неинициализированным, либо используйте бесполезное значение, например 0 или '\0'.

char garbage; 
char useless = 0; 
char useless2 = '\0'; 

В C++, вы должны использовать строковые литералы вместо символьного литерала, если вы хотите, чтобы быть пустым.

(somecondition ? ' ' : '') // error 
(somecondition ? " " : "") // necessary 

Почему именно так? Я предполагаю, что причина C++ унаследована от C.

ответ

10

Причина в том, что символьный литерал определяется как символ. Могут быть расширения, которые позволяют ему быть более чем один символ, но он должен быть как минимум одним персонажем, или это просто не имеет никакого смысла. Это было бы так же, как и пытаться:

int i = ; 

Если вы не указали какое-либо значение, что вы там положили?

+3

Нет необходимости в расширении. Многосимвольные литералы очень стандартны, они просто не очень полезны, потому что их значение определяется реализацией. – Praetorian

3

Это потому, что пустая строка по-прежнему содержит нулевой символ '\0' в конце, поэтому по-прежнему существует значение для привязки к имени переменной, тогда как пустой литерал-символ не имеет значения.

0

String - это набор символов, заканчивающийся символом NULL ('\ 0'). Итак, пустая строка всегда будет иметь NULL-символ в конце.

Но в случае символьного символа никакого значения нет. ему нужен хотя бы один символ.

Смежные вопросы