当我运行以下程序时,我的输出为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;
}
答案 0 :(得分:8)
函数调用中没有函数调用。
在,
a=avg(p,(q=4,r=-12,q),r);
代码:
(q=4,r=-12,q)
指定q = 4
,r = -12
并传递q
作为第二个参数。稍后会更多 [注意:1]
请注意,函数参数的评估顺序为未指定 这意味着参数可以按顺序传递给函数:
在您的示例中,如果您的编译器选择:
-2.....
1
。 正如您从代码示例中看到的那样,最好不要编写任何产生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
的指针;没有函数调用。