簡體   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