解释这个C程序输出的原因

时间:2014-10-13 18:40:25

标签: c

请帮助我理解以下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

4 个答案:

答案 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。如果指定结果值,则不会影响函数调用的效果。