Почему две строки оцениваются как одна сконцентрированная строка [duplicate]

Я столкнулся с той же проблемой, когда устанавливаю Python, и разрешается, когда я устанавливаю PATH в системе, вот шаги.

  • Перейдите к «Панель управления» -> «Система "
  • Нажмите« Дополнительные системные настройки »слева
  • Нажмите« Переменные среды »
  • Найдите и щелкните по переменной« Путь »
  • Нажмите «Изменить»
  • Добавьте «C: \» в поле переменных среды, если вы используете Windows7, затем отделите его точкой с запятой от существующей записи. Если вы используете Windows10, просто нажмите «Создать», чтобы добавить.
  • Повторно запустите командную строку и попробуйте введите описание изображения здесь

20
задан user2864740 28 February 2014 в 02:14
поделиться

5 ответов

Он определен стандартом 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 :-)";
25
ответ дан paxdiablo 22 August 2018 в 14:52
поделиться
  • 1
    Ничего плохого в том, чтобы быть пристальным для деталей. – Aaron Hall♦ 23 May 2014 в 18:23

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

-5
ответ дан a_a_t 22 August 2018 в 14:52
поделиться
  • 1
    а не компилятор, это стандарт ISO. – Seçkin Savaşçı 25 August 2012 в 11:00
  • 2
    ... и как таковой, он встроен в компилятор. Так что это функция компилятора. – a_a_t 25 August 2012 в 14:49
  • 3
    см. принятый ответ. И никого не вводите в заблуждение. Вы должны немного прочитать о компиляторах и проверить свою терминологию. – Seçkin Savaşçı 25 August 2012 в 14:57
  • 4
    Я прочитал ответ, и я думаю, что мы оба правы. Это, действительно, стандарт ИСО и, как таковой, для каждого компилятора обязательно придерживается этого стандарта для его реализации. Я буду называть его «встроенным в компилятор». вместо «функции компилятора», если эта терминология более подходит. – a_a_t 25 August 2012 в 18:44

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

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

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

6
ответ дан Joe 22 August 2018 в 14:52
поделиться

И чтобы ответить на ваш вопрос, который не задан, «Для чего это полезно?»

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

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

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

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

4
ответ дан Mr Lister 22 August 2018 в 14:52
поделиться

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

  1. Связанные жетоны литералов строки объединены.
  2. Символы пробела, разделяющие токены, уже не являются значимыми.
1
ответ дан perilbrain 22 August 2018 в 14:52
поделиться
  • 1
    На самом деле, это вторая, есть активность фазы 7, после после выполняется объединение смежных строковых литералов в фазе 6. Смежный в этом смысле означает, что в любом случае игнорировать пустое пространство. Однако +1 для первого. – paxdiablo 25 August 2012 в 11:13
Другие вопросы по тегам:

Похожие вопросы: