输出不是维持秩序

时间:2014-05-30 19:21:34

标签: c output

我有以下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

2 个答案:

答案 0 :(得分:3)

所以,让我们走一下这个程序的步骤:

  1. 我们为x, y, z创建并设置初始值。
  2. 我们致电printf(..., find(x,y,z));
  3. 要完成printf()来电的工作,我们需要完全评估 find()来电。
    1. find()可以更改名为a, b, c的某些变量的本地值。
    2. find()在其中调用printf(),打印25 30 40\n
    3. find()返回的值为30
  4. 现在,我们实际上有原始printf()调用的参数,我们可以执行它,并打印15 25 30 30\n
  5. 请注意,在我们拥有所有参数之前,我们无法调用第一个printf()。为此,我们需要致电find()并让其全面评估。

答案 1 :(得分:1)

首先,您修改a函数中的参数bcfind,它们会考虑第一行输出中的修改值。但是,这些更改仅在find的正文中可见;参数按C中的值传递。xyzmain的值不受find调用的影响,第二行输出。

换句话说,abcfind函数的局部变量,这些变量由(但与其他方式无关)初始化xyzmain的值。

printf main可以打印其字符串之前,它必须评估其余4个参数,其中包括对find的调用。在调用find的过程中,再次调用printf,这会考虑首先出现的3位数输出行。