我有一个函数,它指向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 */
答案 0 :(得分:3)
mystery
函数执行以下操作:
x
点设置为整数y
指向的值。y
点设置为整数z
指向的值,然后然后将整数z
的值递增为。< / LI>
z
点设置为47。请注意,由于mystery
使用后递增,因此递增从不实际执行任何操作。也就是说,y
在>增加z
之前被指定为,而在z
递增之后,它被明确地设置为47.
现在,在main
:
请注意,q
是指向r
的指针。这意味着当您在mystery
上致电(q, &r, &p)
时,会采取以下措施:
q
点设置为整数&r
指向的值(自q == &r
起无效)。&r
点设置为整数&p
指向的值,然后然后将整数&p
的值递增为。< / LI>
&p
点设置为47。至于printf
函数,正如其他评论自q == &r
以来所说的那样printf("%d %d %d\n", p++, *q, --r);
的行为未定义。
答案 1 :(得分: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
指向的值,i。即r
的值。
由于r
是预先递减的并且未指定参数的执行顺序,因此未精确指定此调用的结果是什么。
但我们知道,之后r
的值为30
。
调用mystery()
时,参数x
被赋予参数q
,y
获得&r
而z
获得&p
}。
现在发生了什么?
我们
*x = *y;
因此设置*q = r
,一个NOP操作(q
指向r
)。
*y = (*z)++;
表示我们增加*z
(= p
),将旧值设为*y
(= r
)。
现在,r
为-46
,p
为-45
。
后者无关紧要,正如我们现在所做的那样
*z = 47;
再次影响p
。
所以神秘之后的价值是p = 47
和r = -46
。 q
仍然指向r
,所以
printf("%d %d %d\n", p, *q, r);
打印47 -46 -46
。
答案 2 :(得分:1)
堆栈上有两个整数变量p
和r
。在mystery()
函数中,x
和y
都指向变量r
,z
指向变量p
。在行
*y = (*z)++;
r
的值更改为46,并在下一行
*z = 47;
p
设为47.
答案 3 :(得分: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说
*q
和r
是同一个变量,同时使用*q
和--r
由于sequence points之间的值更改,printf("%d %d %d\n", p++, *q, --r);
是未定义的行为。