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; 
}
4

3 回答 3

8

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

在,

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

编码:

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

assigns q = 4r = -12q作为第二个参数传递。稍后会详细介绍[注:1]

请注意,函数参数的评估顺序是Unspecified
这意味着参数可以按顺序传递给函数:

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

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

  • 情况 1,那么输出将是-2.....
  • 情况 2则输出为1.
  • 案例3然后输出可以很神奇

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


[注:1]

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

(e1,e2,e3)

是:

对子表达式求值,然后e1求值e2,再求值e3。表达式的值是 的值e3

于 2012-12-11T05:30:53.650 回答
1

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

于 2012-12-11T05:58:21.937 回答
0

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

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

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

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

于 2012-12-11T05:50:15.567 回答