оценивать выражение с обратной косой чертой в середине выражения

Предположим, что в C имеется следующий код:

i=5 \ +6; 

Если я напечатаю i , это даст мне 11.

Я не понимаю, как этот код выполняется правильно. На первый взгляд, я догадался, что это ошибка компилятора из-за непризнанного токена \ . Может ли кто-нибудь объяснить логику? Связано ли это с максимальной логикой munch?

Обратная косая черта в конце строки сообщает компилятору игнорировать символ новой строки.

Это способ форматирования строк для чтения для людей без прерывания исходного текста. Например, если у вас длинная строка, заключенная в кавычки, вы можете использовать обратную косую черту, чтобы продолжить строку на новой строке, не вставляя в строку символ новой строки.

(Это было более полезно, прежде чем стандарт C добавил свойство, что смежные строки, такие как "abc" "def" , объединены. Теперь вы можете поместить строки в последовательные строки, и они будут объединены. До этого вам приходилось используйте обратную косую черту, чтобы сделать это.)

В настоящее время наиболее частое использование обратной косой черты, как указывает здесь, указывает на продолжение макроопределений препроцессора. В отличие от обычных операторов С, операторы препроцессора должны быть в одной строке. Однако некоторые макропроцессоры препроцессора довольно велики. Чтобы отформатировать их (несколько) красиво, определение распространяется по нескольким физическим линиям, но обратная косая черта делает их одной строкой для компилятора (включая препроцессор).

Обратная косая черта, сопровождаемая символом новой строки, полностью удаляется из исходного текста компилятором, в отличие от символа новой строки. Итак, исходный текст:

 abc\ def 

эквивалентен одиночному идентификатору abcdef , а не abc def . Вы можете использовать его в середине любого оператора или другой языковой конструкции, за исключением последовательности триграфа (последовательности триграфов, такие как ??= , Преобразуются в заменяющие символы, такие как # , перед обработкой обратной косой черты-новой строки):

 MyStructureVariable-\ >MemberName IncrementMe+\ + 

Однако не делайте этого. Используйте это разумно.

Практика избежания строк новой строки в конце строки действительно должна означать продолжение утверждения на следующей строке. По-видимому, это было необходимо в старых компиляторах C. Есть только одно место, которое, я уверен, оно по-прежнему необходимо, и это в макроопределениях функций, что обычно недовольно на C ++.

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

Конец обратной косой черты на продолженной линии обычно называют обратной косой чертой.

Если между обратным слэшем и концом строки есть пробел, это все равно непрерывная строка. Однако, поскольку это обычно является результатом ошибки редактирования, и многие компиляторы не будут воспринимать ее как продолжение строки, GCC предупредит вас об этом.

Ссылка