2014-01-20 117 views
3

我讀上C.爲什麼printf不能編譯?

下面的例子出現的Kernigan和Ritchie手冊:

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-字符允許除",\new-line之外的任何字符。

1

編譯器檢測到錯誤,因爲它找到一個\n換行符(即,在worldd後右一個)它已找到一個前"(即,以匹配開口")。

這樣做是因爲正如其他評論者所說,這是規範要求的。

1

參數中有「\ n」。在寫入printf():)的參數時,從未命中輸入