繁体   English   中英

说明此C程序输出的原因

[英]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

前一个0fun()函数调用中printf()语句的执行结果

fun(printf("%d",0))

第二个1是外部printf()的结果,该结果打印出fun()函数调用的返回值。 fun()函数调用发送内部的返回值printf()这始终是1 ,既然你已经初始化的变量astatic的价值a保持相同,并添加每次与函数调用。

因为你总是打印0printf()里面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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM