2014-01-20 5 views
3

Я читаю инструкцию Kernigan и Ritchie на С.Почему именно printf не компилируется?

возникает следующий пример:

printf("hello, world 
"); 

В книге говорится о том, что C компилятор выдаст сообщение об ошибке. Как именно компилятор обнаруживает это, и почему это проблема? Разве он не просто читал новую строку (предположительно в конце мира), как пространство?

+2

Это нарушает спецификации языка для литеральной строки, поэтому компилятор должен создать некоторое сообщение об ошибке для сбоя компиляции. – nhahtdh

+0

Как это обнаруживает компилятор? Точно так же он обнаруживает что угодно. –

+1

Однако вы можете создавать многострочные строки, добавляя \ перед новой строкой. –

ответ

6

Вам не разрешено иметь символ новой строки в строковый литерал, мы можем увидеть, посмотрев на грамматику из C99 draft standard раздела 6.4.5Строковые литералы:

string-literal: 
    " s-char-sequenceopt " 
    L" s-char-sequenceopt " 
s-char-sequence: 
    s-char 
    s-char-sequence s-char 
s-char: 
    any member of the source character set except 
     the double-quote ", backslash \, or new-line character 

Мы можем видеть, что s- char допускает любые символы, кроме ", \ и new-line.

1

компилятор обнаруживает ошибку, потому что он находит \n новой строки (то есть, одно право после d в world), прежде чем он нашел " (то есть, чтобы соответствовать отверстие ").

Он делает это, потому что, как говорили другие комментаторы, это то, что требует спецификация.

1

В аргументе есть «\ n». Никогда не ударяйте введите при написании аргументов для printf() :)

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