printf输出结果不符预期

5
我在想,为什么这个程序的输出结果是5621?
#include <stdio.h>

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

它是否可以编译?main没有返回类型。 - StoryTeller - Unslander Monica
4
阅读有关printf的内容,了解其返回值,再学习关于栈的知识,你就会理解。 - Some programmer dude
2
printf:成功时返回写入的字符总数。 - P0W
3
@StoryTeller 是的,它确实是这样。C函数默认返回类型为 int - JAB
4
在C语言的JAB Pre C99标准中,废除了"隐式int"规则。 - Daniel Fischer
显示剩余3条评论
5个回答

22

printf函数返回其输出的字符数量。

首先,内部最深层的printf函数被调用,输出数字56,然后它将输出的字符数量2返回给中间层的printf函数,输出数字2。最后,输出的字符数量1传递到外层的printf函数,生成数字串5621


9

来自 printfman页面

返回值

成功返回后,这些函数将返回打印的字符数(不包括用于结束字符串输出的空字节)。

内部的printf打印56
已经打印了2个字符,因此下一个%d格式说明符的参数是2
中间的printf只打印了1个字符,因此外部%d格式说明符的参数是1
只有外部的printf包含换行符,因此前面的调用在同一行上依次输出,得到5621\n


6

这相当于

#include <stdio.h>

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

printf返回写入的字符数。


6

printf()函数返回打印出来的字符数:

printf("%d",i)输出值为56
printf("%d",printf("%d",i))先输出56,然后输出2,即数字56中有2个字符。
printf("%d\n",printf("%d",printf("%d",i)))先输出56,然后输出2,接着输出2这个数字包含1个字符。


1
< p > printf()函数返回在控制台打印的字符数。

例如,在以下printf调用之后,num_chars将具有值10,因为字符串"Hi haccks\n"由10个非空字符组成,将在屏幕上打印。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接