2012-12-11 86 views
0

當我運行下面的程序時,我得到的輸出爲1.00000。但我懷疑這個功能是如何工作的?我對它的工作不太確定。請讓我知道下面代碼的工作過程當我們試圖將函數作爲參數傳遞給同一個函數時會發生什麼?

float avg(float,float,float); 

int main() 
{ 
    float p=1,q=2,r=-2,a; 
    a=avg(p,(q=4,r=-12,q),r); 
    printf("%f",a); 
    return 0; 
} 

float avg(float x,float y,float z) 
{ 
    return (x+y+z)/3; 
} 
+3

您沒有將函數傳遞給函數,只是將值賦給q和r – perreal

+0

但是我如何得到輸出爲1.000000 – Praveen

回答

8

函數調用沒有函數調用。

在,

a=avg(p,(q=4,r=-12,q),r); 

的代碼:

(q=4,r=-12,q) 

分配q = 4r = -12並將q作爲稍後第二argument.More [注:1]

請注意,函數參數的評估順序是未指定
這意味着該參數可以傳遞給函數依次是:

  • 案例1:從左向右或
  • 案例2:右至左或
  • 案例3:編譯器希望的任何魔法命令(當然,這隻有在參數不超過2的情況下才可能)

在您的例子,如果你的編譯器的動產:

  • 案例1,則輸出將是-2.....
  • 案例2然後輸出將是1
  • 案例3然後輸出可以神奇

正如你已經從你的代碼示例中看到的那樣,最好是不寫任何這樣的代碼產生side effects


[注:1]

逗號(,)的表達的意思是:

(e1,e2,e3) 

是:

評估子表達式e1,然後評估e2然後評估te e3。表達式的值是e3的值。

+0

好吧。但是因此不會兩次調用該函數? – Praveen

+0

@Praveen:不,它沒有,增加更多解釋希望有所幫助。 –

+0

我不能看得懂....我解釋清楚 – Praveen

0

你確定你沒有得到編譯器警告?如果不是,則啓用-Wall(用於gcc編譯器)。

a = avg(p,(q = 4,r = -12,q),r);

在該函數調用的第一個參數是float (float,float,float)類型NOT float的,按照該函數被定義。你應該得到一個編譯器警告。

第一個參數是函數指針avg;沒有函數調用。

1

你可以得到1作爲輸出,如果X + Y + Z = 3,我們知道,x爲1,那麼Y + Z = 2,這是可能的,如果Q = 4和R = -2。由於評估順序未定義,因此我們可以得出結論,編譯器正在從右向左評估參數。

相關問題