CS-APP:Section 5.1,Memory aliasing :看上去逻辑一样,执行结果一样吗?
以下是一段代码,在表面上是相同的结果和逻辑,但在xp = yp时,会有不同的结果;
1 void twiddle1(int *xp,int *yp)
2 {
3 *xp += *yp;
4 *xp += *yp;
5 }
6
7 void twiddle2(int *xp,int *yp)
8 {
9 *xp += 2* *yp;
10 }
2 {
3 *xp += *yp;
4 *xp += *yp;
5 }
6
7 void twiddle2(int *xp,int *yp)
8 {
9 *xp += 2* *yp;
10 }
测试代码:
1 /*
2 ============================================================================
3 Name : test1.c
4 Author : Gump Yin
5 Version :
6 Copyright : Your copyright notice
7 Description : Hello World in C, Ansi-style
8 ============================================================================
9 */
10
11 #include <stdio.h>
12 #include <stdlib.h>
13
14 void twiddle1(int *xp,int *yp)
15 {
16 *xp += *yp;
17 *xp += *yp;
18 }
19
20 void twiddle2(int *xp,int *yp)
21 {
22 *xp += 2* *yp;
23 }
24
25 int main(void) {
26 int a = 1,b =2;
27 twiddle1(&a,&b);
28 printf("twiddle1 xp != yp :a = %d;b= %d\n",a,b);
29 a = 1;b =2;
30 twiddle2(&a,&b);
31 printf("twiddle2 xp != yp :a = %d;b= %d\n",a,b);
32 int c = 3;
33 twiddle1(&c,&c);
34 printf("twiddle1 xp == yp :c = %d\n",c);
35 c = 3;
36 twiddle2(&c,&c);
37 printf("twiddle2 xp == yp :c = %d\n",c);
38 return EXIT_SUCCESS;
39 }
40
2 ============================================================================
3 Name : test1.c
4 Author : Gump Yin
5 Version :
6 Copyright : Your copyright notice
7 Description : Hello World in C, Ansi-style
8 ============================================================================
9 */
10
11 #include <stdio.h>
12 #include <stdlib.h>
13
14 void twiddle1(int *xp,int *yp)
15 {
16 *xp += *yp;
17 *xp += *yp;
18 }
19
20 void twiddle2(int *xp,int *yp)
21 {
22 *xp += 2* *yp;
23 }
24
25 int main(void) {
26 int a = 1,b =2;
27 twiddle1(&a,&b);
28 printf("twiddle1 xp != yp :a = %d;b= %d\n",a,b);
29 a = 1;b =2;
30 twiddle2(&a,&b);
31 printf("twiddle2 xp != yp :a = %d;b= %d\n",a,b);
32 int c = 3;
33 twiddle1(&c,&c);
34 printf("twiddle1 xp == yp :c = %d\n",c);
35 c = 3;
36 twiddle2(&c,&c);
37 printf("twiddle2 xp == yp :c = %d\n",c);
38 return EXIT_SUCCESS;
39 }
40
测试结果:
1 twiddle1 xp != yp :a = 5;b= 2
2 twiddle2 xp != yp :a = 5;b= 2
3 twiddle1 xp == yp :c = 12
4 twiddle2 xp == yp :c = 9
5
2 twiddle2 xp != yp :a = 5;b= 2
3 twiddle1 xp == yp :c = 12
4 twiddle2 xp == yp :c = 9
5