我有以下C程序。我不理解这个程序的输出:
#include <stdio.h>
int find (int a, int b, int c)
{
int temp;
c=a+b;
temp=a;
a=b;
b=2*temp;
printf("%d %d %d\n", a,b,c);
return b;
}
int main()
{
int x, y, z;
x=15;
y=25;
z=30;
printf("%d %d %d %d\n", x, y, z, find(x,y,z));
return 0;
}
据我说,输出值应为:
15 25 30
25 30 40 30
但为什么会这样:
25 30 40
15 25 30 30
答案 0 :(得分:3)
所以,让我们走一下这个程序的步骤:
x, y, z
创建并设置初始值。printf(..., find(x,y,z));
printf()
来电的工作,我们需要完全评估 find()
来电。
find()
可以更改名为a, b, c
的某些变量的本地值。find()
在其中调用printf()
,打印25 30 40\n
。find()
返回的值为30
。printf()
调用的参数,我们可以执行它,并打印15 25 30 30\n
。请注意,在我们拥有所有参数之前,我们无法调用第一个printf()
。为此,我们需要致电find()
并让其全面评估。
答案 1 :(得分:1)
首先,您修改a
函数中的参数b
,c
和find
,它们会考虑第一行输出中的修改值。但是,这些更改仅在find
的正文中可见;参数按C中的值传递。x
中y
,z
和main
的值不受find
调用的影响,第二行输出。
换句话说,a
,b
和c
是find
函数的局部变量,这些变量由(但与其他方式无关)初始化x
中y
,z
和main
的值。
在printf
main
可以打印其字符串之前,它必须评估其余4个参数,其中包括对find
的调用。在调用find
的过程中,再次调用printf
,这会考虑首先出现的3位数输出行。