2017-02-09 1 views
3

[lex.ccon] содержит следующее определение с-полукокса:Возможное противоречие в определении с-полукокса в [lex.ccon]

с-символ:
        любой член исходного характера
                кроме одинарной кавычки , обратной косой черты \ или символа новой строки
        побега последовательности
        универсального символьного имя

Учитывая что new-line character in C is the escape-sequence \n, нет ли в определении выше противоречия?

PS: обратите внимание, что стандарт C++ не определяет, что такое символ новой строки.

+0

Стандарт C++ также не определяет, что такое одна кавычка (вместо этого, похоже, подразумевается, что символ Юникода «RIGHT SINGLE QUOTATION MARK» (U + 2019) является одиночной кавычкой). – cpplearner

ответ

1

Стандарт C++ действительно говорит, что символы новой строки вводятся для отслуживших линии показателей в translation phase 1, исходный файл разбивается на предобработки лексем (A символьного литерала является маркером предварительной обработки) и последовательностей (включая комментарии) в translation phase 3, и каждая escape-последовательность (\n - это escape-последовательность) преобразуется в соответствующий элемент набора символов выполнения в translation phase 5.

Так четко определено, что при формировании символьного литерала, последовательность символов \n не превратился в символ новой строки, а конец-линии индикатора (который, как и все детали фазы перевода 1, определяется реализацией, но, как правило, согласовано, что индикатор конца строки LF в Unix и Unix-подобных системах CR + LF в Windows) уже был превращен в символ новой строки.

+0

Мне потребовалось некоторое время, чтобы понять, что вы написали выше. Это был отличный ответ, и я полностью согласен с этим. (+1). –

5

Нет, когда определение говорит «символ новой строки» это означает фактической новой строку, а не специальная последовательность два символов (обратный слэш и n), который может быть интерпретирован компилятором как новая строка в особых обстоятельствах (внутри постоянной строки или символьных литералов).

+2

Точно: это означает, что вы не можете писать 'const char c = '', а затем иметь конец строки. (Так же, как вы не можете написать 'const char c = '' ';') –

+0

'Нет, когда определение говорит« символ новой строки », это означает фактическую новую строку.« Как вы это знаете? Стандарт не определяет «символ новой строки». Что вы подразумеваете под «актуальной новой линией»? –

+1

@ JoãoAfonso «новая линия» в стандарте - это новая строка на платформе, она не определена, потому что она должна быть известной сущностью. В кодировке ASCII это символ строки, '0x0a'. В [EBCDIC] (https://en.wikipedia.org/wiki/EBCDIC) это может быть NL ('0x15') или LF (' 0x25').Это то, что будет означать буквальный '' \ n'' константный символ для текущей платформы. –

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