1

我有一个将指针int作为参数的函数,当我第一次运行代码时,结果是:

-47 30 30

我想知道为什么,在第二次通过后,现在的值是

47 -46 -46

我似乎无法理解它,请帮助我理解代码的流程。

 #include  <stdio.h>

 void  mystery(int *, int *, int *);

 int main(void) {
   int p = -47, *q, r = 31;
   q = &r;
   printf("%d %d %d\n", p++, *q, --r); 
   mystery(q, &r, &p);
   printf("%d %d %d\n", p, *q, r); 
   return 0;
 } /* End of main. */

 void mystery (int *x, int *y, int *z) { 
   *x = *y;
   *y = (*z)++;
   *z = 47; 
   return;
 } /* End of mystery */
4

4 回答 4

3

mystery函数执行以下操作:

  1. 将整数x指向的值设置为整数指向的值y
  2. 将整数y指向的值设置为整数指向的值z然后递增整数z指向的值。
  3. 将整数z点设置为 47。

请注意,由于mystery使用的是后增量,因此增量实际上从不做任何事情。也就是说,在递增之前y分配,在递增之后,它被显式设置为 47。zz

现在,在main

请注意,这q是一个指向r. 这意味着当您调用mystery(q, &r, &p),它会执行以下操作:

  1. 将整数点设置为整数q点的值&r(从 开始,这没有任何作用q == &r)。
  2. 将整数&r指向的值设置为整数指向的值&p然后递增整数&p指向的值。
  3. 将整数&p点设置为 47。

至于printf功能,正如其他评论所说,因为q == &r的行为printf("%d %d %d\n", p++, *q, --r);是未定义的。

于 2013-10-09T21:09:29.973 回答
1

好吧,让我们看看会发生什么。

int p = -47, *q, r = 31;
q = &r;

现在我们有以下变量:

  • p是一个int并且包含-47
  • r是一个int并且包含31
  • q是一个int *并且指向r

现在我们做

printf("%d %d %d\n", p++, *q, --r);

p++表示-47被打印并且 的值p增加,所以我们有-46. *q表示我们使用q指向的值,即 的值r。由于r预先递减并且未指定参数的执行顺序,因此未准确指定此调用的结果是什么。

但我们知道,事后,r是有价值的30

调用mystery()时,参数x被分配参数qygets&rzgets &p

现在这里发生了什么?

我们的确是

*x = *y;

因此设置*q = r,一个 NOP 操作(如q指向r)。

*y = (*z)++;

这意味着我们增加*z(= p),将旧值放入*y(= r)。

所以现在,r-46p-45

后者是无关紧要的,就像我们现在所做的那样

*z = 47;

p再次影响。

所以神秘之后的值是p = 47r = -46q仍然指向r,所以

printf("%d %d %d\n", p, *q, r); 

打印47 -46 -46

于 2013-10-09T21:18:47.700 回答
1

您在堆栈上有两个整数变量,p并且r. 在mystery()函数中,xand都y指向变量r,也z指向变量p。在行

*y = (*z)++;

的值r更改为 46 并在下一行

*z = 47;

p设置为 47。

于 2013-10-09T21:20:02.440 回答
1

初次打印后,您调用了函数

    Here p=-47 and *q=r=30  

    mystery(q, &r, &p); // made a call to function same as  mystery(&r, &r, &p);

    initializes *x=30,*y=30 and *z=-47

    //Here x and y are pointing to same reference.These consists address of `r`

    *x = *y;     // this statement makes *q=r=30
    *y = (*z)++; // this statement makes *q=r=-46 , increment -47 by 1 and assign to *y

    *z = 47; //this makes p=47

和 AS @kevin 说

*qr是同一个变量,由于序列点之间的值发生变化,因此在 中使用*q和是未定义的行为。--r
printf("%d %d %d\n", p++, *q, --r);

于 2013-10-09T21:20:37.690 回答