char* a="dsa" "qwe";
printf("%s",a);
вывод: dsaqwe
Мой вопрос, почему эта вещь работает. Если я даю пробел или ничего между двумя строковыми литералами, он конкатенирует строковые литералы.
Как это работает?
char* a="dsa" "qwe";
printf("%s",a);
вывод: dsaqwe
Мой вопрос, почему эта вещь работает. Если я даю пробел или ничего между двумя строковыми литералами, он конкатенирует строковые литералы.
Как это работает?
Он определяется стандартом ISO C, смежные строковые литералы объединяются в один.
Язык немного сух (в любом случае это стандарт), но раздел 6.4.5 String literals
состояний C11:
В фазе 6 перевода многосимвольные последовательности символов, заданные любой последовательностью смежный символ и тождественно-префиксы с широким строковым литералом объединяются в одна многобайтовая последовательность символов.
Это также упоминается в 5.1.1.2 Translation phases, point 6
, немного более лаконично:
Смежные строковые литералы объединяются.
В основном это означает, что "abc" "def"
не отличается от "abcdef"
.
Это часто полезно для создания длинных строк при хорошем форматировании:
char *myString = "This is a really long "
"string and I don't want "
"to make my lines in the "
"editor too long, because "
"I'm basically anal retentive :-)";
Вы ответили на свой вопрос.
Если я даю пробел или ничего между двумя строковыми литералами, он конкатенирует строковые литералы.
Это одна из особенностей синтаксиса C.
И чтобы ответить на ваш непрошенный вопрос: "Для чего это полезно?"
С одной стороны, вы можете поместить константы в строковые литералы. Вы можете написать
#define FIRST "John"
#define LAST "Doe"
const char* name = FIRST " " LAST;
const char* salutation = "Dear " FIRST ",";
а затем, если вам нужно будет изменить имя позже, вам нужно будет только изменить его в одном месте.
Такие вещи.
Стандарт ISO C §5.1.1.2
говорит: -
- Связанные токены строковых литералов конкатенированы.
- Символы белого пространства, разделяющие токены, уже не являются значимыми.
Я уверен, что это компилятор.