2014-09-26 81 views
-4

的怪異輸出據我瞭解printf函數

int a=0; 
printf("%d",a); 

作品一樣

char *ptr="%d" 

ptr指向%,然後PTR從%讀取整個字符串的4個字節從內存中讀取。

現在考慮下面的代碼

printf("%d"+1,a); //value of a=0 

是相同

char *ptr="%d" 
ptr+=1; 

PTR現在指向d等從d字符串印刷現在

printf(1+"Alex"); //prints lex 

ptr點l和打印字符串從那裏...

現在會發生什麼在以下情況?它似乎超出我的範圍。

  1. printf("%",a);

  2. printf("%%%%");

  3. printf("%%d",a);

回答

4

printf("%",a);不具有有效的轉換說明,所以它是由覆蓋:

§7.21.6.1

9如果轉換規格無效,則行爲爲 未定義。如果任何參數不是 相應轉換規範的正確類型,則行爲未定義。

printf("%%%%");只會打印%%,因爲%%是一個轉換說明符。請參閱printf man pages

A '%' 被寫入。沒有參數被轉換。完整轉換 規範是'%%'。

正如在評論中提到的,printf("%%d",a);可能不是未定義的行爲。 %%變爲%,並且a被忽略。

§7.21.6.1

2所述的函數fprintf寫入輸出到流指向流, 下字符串的控制由格式指定 後續參數如何被轉換爲輸出指向。如果格式的 參數不足,則行爲未定義。如果 格式在參數保留時用盡,則會對超出的參數 進行評估(如往常一樣),但會被忽略。當遇到格式字符串的結尾時,函數返回fprintf 函數。

+0

wHat i feel for printf(「%%%%」); 編譯器注意到第一個%超過了它......然後它注意到第二個%而不是格式說明符,所以它打印了它......現在它進入第三個%,並在它過去之後注意是否存在任何格式說明符,但它沒有注意到它.....所以4%被打印....我是誰? – user3126632 2014-09-27 05:32:27

0

我希望從C標準這句話會幫你

8轉換說明符及其含義如下:

%寫入%字符。沒有參數被轉換。完整的 轉換規範應爲%%。

例如

printf("%%%%"); 

將輸出

%%