当我们尝试将函数作为参数传递给同一个函数时会发生什么?

时间:2012-12-11 05:27:18

标签: c

当我运行以下程序时,我的输出为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 个答案:

答案 0 :(得分:8)

函数调用中没有函数调用。

在,

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

代码:

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

指定q = 4r = -12并传递q作为第二个参数。稍后会更多 [注意:1]

请注意,函数参数的评估顺序为未指定 这意味着参数可以按顺序传递给函数:

  • 案例1:从左到右或
  • 案例2:从右到左或
  • 案例3:编译器想要的任何神奇的顺序(当然,只有当参数不超过2时才有可能)

在您的示例中,如果您的编译器选择:

  • 案例1 ,然后输出为-2.....
  • 案例2 然后输出为1
  • 案例3 然后输出可能是神奇的

正如您从代码示例中看到的那样,最好不要编写任何产生side effects的代码。


[注:1]

表达式中逗号运算符(,)的含义:

(e1,e2,e3)

是:

  

评估子表达式e1,然后评估e2,然后评估e3。表达式的值是e3的值。

答案 1 :(得分:1)

如果x + y + z = 3,你可以得到1作为输出。我们知道x是1,所以y + z = 2.如果q = 4且r = -2,这是可能的。由于评估顺序未定义,因此我们可以得出结论,编译器正在从右到左评估参数。

答案 2 :(得分:0)

您确定没有收到编译器警告吗?如果没有,请启用-Wall(对于gcc编译器)。

  
    

α= AVG(P,(Q = 4,R = -12,Q),R);

  

此函数调用中的第一个参数类型为float (float,float,float) NOT float,因为函数已定义。你应该得到编译器警告。

第一个参数是指向函数avg的指针;没有函数调用。