(*p)++ 与 *p++ 与 ++*p 拨开一团迷雾
环境:win7
IDE:DEV-C++
编译器:GCC
1.先说++i和i++的基础
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <stdio.h> //just change simple void stop( void ) { system ( "pause" ); } int main( void ) { int i = 1; printf ( "i++ = %d\n" ,i++); printf ( "i = %d\n" ,i); int j = 1; printf ( "++j = %d\n" ,++j); printf ( "j = %d\n" ,j); printf ( "i++ = : %d ++i = %d\n" ,i++,++i); printf ( "i = %d\n" ,i); printf ( "++j = : %d j++ = %d\n" ,++j,j++); printf ( "j = %d\n" ,j); stop(); return 0; } |
运行结果:
1 i++ = 1
2 i = 2
3 ++j = 2
4 j = 2
5 i++ = : 3 ++i = 3
6 i = 4
7 ++j = : 4 j++ = 2
8 j = 4
1)i++只有遇到";"分号才会影响i的值, i++输出的值还是1,i的值也是1
2)i经过分号之后,i=2,因为自增了
3)++j不管遇到不遇到分号";"都会影响j值和++j值,所以J=2
4)j的值也是2
5)根据编译器的不同和操作系统的不同,printf计算方向也不同,这是从右开始计算,先++i,再i++,所以输出3 和3
6)最后一个i++遇到了分号,所以i=4
7)从右开始计算,j打印的结果还是2,但是第二次取出来的值是3,所以++j=4
2.理清概念 *p++ 中 *和++的优先级
1 #include <stdio.h>
2
3 //just change simple
4 void stop(void)
5 {
6 system("pause");
7 }
8
9 int main(void)
10 {
11 int i = 5;
12 int *p;
13 p = &i;
14 printf("1-p = %d\n",p);
15 int v;
16 v = *p++;
17 printf("v = %d\n",v);
18 printf("2-p = %d\n",p);
19 printf("i = %d\n",i);
20 system("pause");
21 return 0;
22 }
运行结果:
1 1-p = 2686788
2 v = 5
3 2-p = 2686792
4 i = 5
从结果来看++符号影响了p的值并没有影响i的值,好像++的优先级要高于 指针*符号
再看例子
1 #include <stdio.h>
2
3 //just change simple
4 void stop(void)
5 {
6 system("pause");
7 }
8
9 int main(void)
10 {
11 int i = 5;
12 int *p;
13 p = &i;
14 printf("1-p = %d\n",p);
15 int v;
16 v = ++*p;
17 printf("v = %d\n",v);
18 printf("2-p = %d\n",p);
19 printf("i = %d\n",i);
20 system("pause");
21 return 0;
22 }
运算结果:
1 1-p = 2686784
2 v = 6
3 2-p = 2686784
4 i = 6
怎么++不影响p的值了?
再看例子
把 代码稍微调整:v = *++p;
运算结果:
1 1-p = 2686788
2 v = 2686840
3 2-p = 2686792
4 i = 5
啊额,原来 * 和++优先级是同一级别,同一级别按照从右往左的顺序计算。
OK了,渐渐的所有问题都解决了,
*(p++)
*(++p)
(*p)++
++(*p)应该没有问题了
迷雾终于拨开了。。。
1 |
分类: C