请帮助我理解以下C程序的输出。
#include "stdio.h"
int fun(int x)
{
static int a=0;
return x+a++;
}
int main()
{
int i;
for(i=0;i<5;++i)
printf("%d ",fun(printf("%d",0)));
return 0;
}
输出是:01 02 03 04 05
为什么不:1 2 3 4 5
答案 0 :(得分:3)
第一个0
是在printf()
函数调用中执行fun()
语句的结果
fun(printf("%d",0))
,第二个1
是外部printf()
的结果,它打印fun()
函数调用的返回值。 fun()
函数调用发送内部printf()
的返回值,该值始终为1
,因为您已将变量a
初始化为static
的值{ a
保持不变,并且每次使用函数调用都会添加。
因为您始终在0
函数调用中的printf()
内打印fun()
,因此在数字前面0
。
答案 1 :(得分:2)
当您在此处致电printf
时,会按顺序评估参数:
printf("%d ",fun(printf("%d",0)));
外部printf
调用需要评估其所有参数,如下所示:
fun(printf("%d",0))
然后调用内部printf
来评估它的所有参数。
首先,将评估printf("%d",0)
,并评估打印的字符数(因为这是printf()
返回的内容)。这将传递给fun
next,这将返回printf
打印的字符数(1)加上它被调用的次数(由于static int a
)。然后将传递给外部printf,打印第二个数字,然后打印一个空格。
答案 2 :(得分:0)
原因在于此声明
printf("%d ",fun(printf("%d",0)));
函数printf
被调用两次。首先,它被称为函数fun
fun(printf("%d",0))
并输出远离0。
第二次调用函数时调用函数fun
,考虑调用的值
printf("%d",0)
始终等于1.
答案 3 :(得分:0)
以您评估的方式设想您的命令:
printf("%d ",fun(printf("%d",0)));
相当于:
int printf_result = printf("%d",0);
int fun_result = fun(printf_result);
printf(("%d ",fun_result);
这是c。这不是python或matlab。如果指定结果值,则不会影响函数调用的效果。