2013-07-23 50 views
5

我想知道爲什麼這個程序的結果是5621?printf給出意想不到的結果

#include <stdio.h> 

main() 
{ 
    int i=56; 
    printf("%d\n",printf("%d",printf("%d",i))); 
    getch(); 
} 
+0

它甚至編譯? 'main'沒有返回類型 – StoryTeller

+4

閱讀關於['printf'](http://en.cppreference.com/w/c/io/fprintf)以及返回結果,並瞭解堆棧,並且您將理解。 –

+2

printf:成功時返回寫入的字符總數。 – P0W

回答

22

printf返回已打印字符的數量。

因此,首先最內部的printf被調用56,打印56。然後它將已打印的字符數量(2)返回到中間printf,打印2。最後,打印的字符數量(1)被傳遞到外部printf,然後打印出來以生成5621

1

printf()函數返回它在控制檯上打印的字符數。

例如,在下面的printf調用之後,num_chars將具有值10作爲字符串"Hi haccks\n"包含將在屏幕上打印的10個非nul字符。

num_chars = printf("Hi haccks\n"); 
//     ^^^^^^^^^^
//     12345678910  

\n是單個10 炭。所以在上面的代碼中返回printf的值賦給num_chars變量。

在代碼中,在給定的發言,內printf()打印值,然後返回該值通過外printf的打印的字符的數目,如下所示:

// 1    2   3 
printf("%d\n", printf("%d", printf("%d",i))); // Here i = 56 
     ^   ^  ^ 
    print: 1  print: 2   print: 56 
    returns: 1  returns: 1  returns: 2 
// 3    2    1  <--Order of printf called 

所以它輸出5621

+1

@delnan爲了清晰起見,它已被編輯並重新編輯。 – gtrig

9

從在printfman page

返回值

成功返回後,這些函數返回打印的 字符數(不包括用於結束輸出的空字節爲 字符串)。

56被印刷用於內printf
2個字符被印所以參數至下一%d格式說明是2
1個字符是由中間printf印刷這樣的參數外%d格式說明是1
只有外層printf包含一個換行符,所以前面的調用在同一行上依次輸出,給出5621\n

6

printf()返回打印的字符的數目:

printf("%d",i)輸出值56
printf("%d",printf("%d",i))輸出56然後2,字符數56
printf("%d\n",printf("%d",printf("%d",i)))輸出56,然後2,那麼2中的字符數,即1

6

這相當於

#include <stdio.h> 

main() 
{ 
    int n, i = 56; 
    n = printf("%d",i); 
    n = printf("%d", n); 
    n = printf("%d\n", n); 
} 

的printf返回寫入的字符數。

相關問題