[C语言](*p)++ 与 *p++ 与 ++*p
转自:http://www.cnblogs.com/IAmBetter/p/3175711.html
环境:win7
编译器:GCC
1.先说++i和i++的基础
代码如下:
#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; }
运行结果:
i++ = 1 i = 2 ++j = 2 j = 2 i++ = : 3 ++i = 3 i = 4 ++j = : 4 j++ = 2 j = 4
在ubuntu中运行结果如下:
注意:
1) i++只有遇到";"分号才会影响i的值, i++输出的值还是1,i的值也是1
2) i经过分号之后,i=2,因为自增了
3) ++j不管遇到不遇到分号";"都会影响j值和++j值,所以J=2
4)j的值也是2
5) 根据编译器的不同和操作系统的不同,printf计算方向也不同。在win7中printf是从右向左执行因为操作的是输出栈!从右开始计算,先++i,再i++,所以输出3 和3。但在Ubuntu中却输出不一样的结果。所以,在实际应用中,不应该写出这样的代码!!!
6)最后一个i++遇到了分号,所以i=4
7) 从右开始计算,j打印的结果还是2,但是第二次取出来的值是3,所以++j=4
2.理清概念 *p++ 中 *和++的优先级
#include <stdio.h> //just change simple void stop(void) { system("pause"); } int main(void) { int i = 5; int *p; int v; p = &i; printf("1-p = %p\n",p); printf("1-*p = %d\n",*p); v = *p++; printf("v = %d\n",v); printf("2-p = %p\n",p); printf("1-*p = %d\n",*p); printf("i = %d\n",i); system("pause"); return 0; }
运行结果:
1-p = 0x7ffeb4672f80
1-*p = 5
v = 5
2-p = 0x7ffeb4672f84
1-*p = 5
i = 5
从结果来看++符号影响了p的值并没有影响i的值,++的优先级要高于 指针*符号
再看例子
#include <stdio.h> //just change simple void stop(void) { system("pause"); } int main(void) { int i = 5; int *p; int v; p = &i; printf("1-p = %p\n",p); printf("1-*p = %d\n",*p); v = ++*p; printf("v = %d\n",v); printf("2-p = %p\n",p); printf("1-*p = %d\n",*p); printf("i = %d\n",i); system("pause"); return 0; }
运算结果:
1-p = 0x7ffe33f90ff0
1-*p = 5
v = 6
2-p = 0x7ffe33f90ff0
2-*p = 6
i = 6
怎么++不影响p的值了?
再看例子
把 代码稍微调整:v = *++p;
运算结果:
1-p = 0x7ffece92b660
1-*p = 5
v = 32766
2-p = 0x7ffece92b664
2-*p = 32766
i = 5
啊额,原来 * 和++优先级是同一级别,同一级别按照从右往左的顺序计算。
下面是一条面试题:
#include <stdio.h> //just change simple void stop(void) { system("pause"); } int main(void) { int a[] = {1,2,3,4,5,6,7,8,9}; int *p = a; printf("*p = %d\n", *p); printf("*p++ = %d\n", *p++); printf("*(p++) = %d\n", *(p++)); printf("*p = %d\n", *p); printf("(*p)++ = %d\n",(*p)++); p += 3; printf("&a = %d\n", &a); printf("*p = %d,&a+3 = %d\n", *p, &a+3); return 0; }
运行结果:
*p = 1 *p++ = 1 *(p++) = 2 *p = 3 (*p)++ = 3 &a = -299729216 *p = 6,&a+3 = -299729108
注:
1)由于++比*优先级高,所以printf("*(p++) = %d\n", *(p++));等同于printf("*p++ = %d\n", *p++);
2)解析&a+3:由于数组a在初始化时定义数组长度为9,即占用内存空间sizeof(int)*9=4*9=36,而&a代表数组a首地址,+3表示指向数组第四行,
即&a+3 = a[0]地址+36*3=a[0]地址+108。
把上面代码中数组和指针p的初始化改为:
char a[] = {1,2,3,4,5,6,7,8,9};
char *p = a;
运行结果:
*p = 1 *p++ = 1 *p = 2 *(p++) = 2 *p = 3 (*p)++ = 3 &a = -318663840 *p = 6,&a+3 = -318663813