Подтвердить что ты не робот

Как работает конкатенация двух строковых литералов?

char* a="dsa" "qwe";
printf("%s",a);

вывод: dsaqwe

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

Как это работает?

4b9b3361

Ответ 1

Он определяется стандартом 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 :-)";

Ответ 2

Вы ответили на свой вопрос.

Если я даю пробел или ничего между двумя строковыми литералами, он конкатенирует строковые литералы.

Это одна из особенностей синтаксиса C.

Ответ 3

И чтобы ответить на ваш непрошенный вопрос: "Для чего это полезно?"

С одной стороны, вы можете поместить константы в строковые литералы. Вы можете написать

#define FIRST "John"
#define LAST "Doe"

const char* name = FIRST " " LAST;
const char* salutation = "Dear " FIRST ",";

а затем, если вам нужно будет изменить имя позже, вам нужно будет только изменить его в одном месте.
Такие вещи.

Ответ 4

Стандарт ISO C §5.1.1.2 говорит: -

  • Связанные токены строковых литералов конкатенированы.
  • Символы белого пространства, разделяющие токены, уже не являются значимыми.

Ответ 5

Я уверен, что это компилятор.