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