[英]Explain the reason for such output of this C program
请帮助我理解以下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
是fun()
函数调用中printf()
语句的执行结果
fun(printf("%d",0))
第二个1
是外部printf()
的结果,该结果打印出fun()
函数调用的返回值。 的fun()
函数调用发送内部的返回值printf()
这始终是1
,既然你已经初始化的变量a
是static
的价值a
保持相同,并添加每次与函数调用。
因为你总是打印0
中printf()
里面fun()
函数调用,因此0
的数字前。
当您在此处调用printf
时, printf
顺序评估参数:
printf("%d ",fun(printf("%d",0)));
外部printf
调用需要评估其所有参数,如下所示:
fun(printf("%d",0))
然后调用内部printf
评估其所有参数。
首先,将对printf("%d",0)
进行求值,并求出要打印的字符数(因为这是printf()
返回的结果)。 接下来将其传递给fun
,它将返回printf
打印的字符数(1)加上被调用的次数(由于static int a
)。 然后将其传递到外部printf,先打印第二个数字,然后打印一个空格。
原因是在此声明中
printf("%d ",fun(printf("%d",0)));
函数printf
被调用两次。 首先,它被称为函数fun
的参数表达式
fun(printf("%d",0))
并输出走数0。
第二次使用函数fun
的调用的结果来调用该函数时要考虑到调用的值
printf("%d",0)
总是等于1。
想象一下您的命令被评估的方式:
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。 如果分配结果值,则不会影响函数调用的效果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.