我讀上C.爲什麼printf不能編譯?
下面的例子出現的Kernigan和Ritchie手冊:
printf("hello, world
");
書中指出,C編譯器將產生錯誤消息。編譯器如何檢測這個問題,爲什麼這是一個問題?它不應該只是閱讀新行(大概是在世界的盡頭),因爲沒有空間嗎?
我讀上C.爲什麼printf不能編譯?
下面的例子出現的Kernigan和Ritchie手冊:
printf("hello, world
");
書中指出,C編譯器將產生錯誤消息。編譯器如何檢測這個問題,爲什麼這是一個問題?它不應該只是閱讀新行(大概是在世界的盡頭),因爲沒有空間嗎?
你不允許在一個字符串文字換行,我們可以從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-字符允許除"
,\
和new-line
之外的任何字符。
編譯器檢測到錯誤,因爲它找到一個\n
換行符(即,在world
的d
後右一個)它已找到一個前"
(即,以匹配開口"
)。
這樣做是因爲正如其他評論者所說,這是規範要求的。
參數中有「\ n」。在寫入printf():)的參數時,從未命中輸入
這違反了文字字符串的語言規範,因此編譯器應該會生成一些錯誤消息,以免編譯失敗。 – nhahtdh
編譯器如何檢測這個?它以相同的方式檢測任何東西。 –
但是,您可以在新行之前添加\來製作多行字符串。 –