以下C程序的输出是什么?
#include <stdio.h>
void abc (float, float, float *);
void main() {
float y = 2.5;
abc (6.5, y, &y);
printf ("%f\n",y);
}
void abc (float x, float y, float *z) {
y = y - 1;
*z = *z + x;
}
a)1.5 b)2.5 c)8.0 d)9.0 e)9.5
答案是d)9.0。有人可以解释一下这是为什么吗?我认为这将是c)8.0因为在函数中我更新了y的值,因为y = y-1变为1.5。谢谢!
答案 0 :(得分:2)
简短的回答是y
中的main
和y
中的abc
具有相同的名称,但它们是不同的。 abc
中的那个只是一个副本。
首先,请注意函数abc
的第一行是无用的,它会修改y
,但之后不会使用y
。因为当您调用函数时,会生成每个参数的副本,但这不会修改y
中的main
。现在y
中的abc
根本没有使用,所以我们可以从参数中删除它。
所以你可以这样重写abc
:
void abc (float x, float *z) {
*z = *z + x;
}
由于这样一个简单的单行函数没有多大意义,我们可以像这样重写你的程序:
void main() {
float y = 2.5;
y = y + 6.5;
printf ("%f\n",y);
}
现在结果非常明显。
答案 1 :(得分:0)
简单,第三个参数是指向y
中main()
的指针。稍后将打印y
值。
在abc()
内,float y
是局部变量。对其值所做的任何更改都不会反映在调用者参数中。
OTOH,根据指针的逻辑,*z
保留abc()
内的计算值,从而将值反映回main()
。
简而言之,使用第三个参数abc()
反映z
内的计算值。
z
==&gt;的计算6.5 + 2.5 = 9.0
答案 2 :(得分:0)
abc (6.5, y, &y);
请注意,此处最后一个参数是按引用调用,并且您传递变量y
的地址。
稍后在函数abc()
中执行
*z = *z + x
*z = 2.5
被称为取消引用指针,并且指针所指向的地址中存储的值为2.5和x=6.5
,因为您将它传递给value.So
*z = 2.5 + 6.5 = 9.0
现在main()
的值y=9.0
,因为变量y
的地址中存储的值已被函数调用abc()
答案 3 :(得分:0)
在函数内部调用abc (6.5, y, &y)
时,它将如下所示:
void abc (x = 6.5, y = 2.5, *z = 2.5) {
y = 2.5 - 1; // y = 1.5
*z = 2.5 + 6.5; // *z = 9.0
}
函数内的*z
与函数外的y
相同,因此y = 9.0
。