2013-07-23 135 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返回写入的字符数。

相关问题