1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > C语言:*(p++)与*p++ *(++p)与*++p ++*p与++(*p) (*p)++的区别

C语言:*(p++)与*p++ *(++p)与*++p ++*p与++(*p) (*p)++的区别

时间:2022-02-20 11:07:53

相关推荐

C语言:*(p++)与*p++ *(++p)与*++p ++*p与++(*p) (*p)++的区别

分析方法:后缀运算符++优先级高于前缀运算符++和*,后缀运算符++结合规律从左至右(即先返回值再自增),前缀运算符++和*的优先级相同,结合规律自右至左。

举例如下:

#include <stdio.h>

int main(int argc, char *argv[])

{

int arrayA[4] = {4, 3, 2, 1};

int *p1 = NULL, *p2=NULL;

/* 1: *(p++)与*p++相同 */

p1 = arrayA, p2 = arrayA;

printf("第一次:*(p1++)=%d *p2++=%d\n", *(p1++), *p2++);

printf("第二次:*(p1++)=%d *p2++=%d\n", *(p1++), *p2++);

/*打印结果:

第一次:*(p1++)=4 *p2++=4

第二次:*(p1++)=3 *p2++=3

分析:后缀运算符++优先级高,第一次执行*p1++时,p1++表示先取值后p1再自增,p1

取到的值和*结合取出p1指向地址的值,即arrayA首地址的值,即4。第二次执行时p1自增后

指向arrayA[1]的地址,所以取值为3

*/

/* 2: *(++p)与*++p相同: */

p1 = arrayA, p2 = arrayA;

printf("*(++p1)=%d *++p2=%d *p1=%d *p2=%d\n", *(++p1), *++p2, *p1, *p2);

/*打印结果:

*(++p1)=3 *++p2=3 *p1=4 *p2=4

*/

/* 3: ++*p与++(*p)相同:注意,printf函数打印自右向左, */

p1 = arrayA, p2 = arrayA;

printf("arrayA[0]=%d ++*p1=%d ++(*p2)=%d *p1=%d *p2=%d\n", arrayA[0], ++*p1, ++(*p2), *p1, *p2);

/*打印结果:

arrayA[0]=6 ++*p1=6 ++(*p2)=5 *p1=4 *p2=4

分析:printf函数打印自右向左,首先执行++(*p2),先对p2指向地址的值进行++运算,即将

arrayA[0]的值++运算后变成5,因++*p与++(*p)结合规则是相同的,p1也是指向arrayA[0]地址,

所以++*p1后arrayA[0]的值变成6。

*/

/* 4: (*p)++ */

p1 = arrayA;

printf("arrayA[0]=%d, (*p1)++=%d (*p1)++=%d *p1=%d\n",arrayA[0], (*p1)++, (*p1)++, *p1);

/*打印结果:

arrayA[0]=8, (*p1)++=7 (*p1)++=6 *p1=6

分析:printf函数打印自右向左,(*p1)++先取出p1指向地址的值打印,然后再将p1指向地址的值++运算。

*/

/* 5: ++复杂用法

++(*p)++: 不合法:自增操作数必须是左值

++(*++p++):不合法:自增操作数必须是左值

++(++*p++):

++(*p++):

(++*p++):

*/

p1 = &arrayA[1];

printf("前:arrayA[1]=%d arrayA[2]=%d\n" ,arrayA[1], arrayA[2]);

printf("++(*p1++)=%d ++*p1++=%d *p1=%d\n",++(*p1++), ++*p1++, *p1);

printf("后:arrayA[1]=%d arrayA[2]=%d\n" ,arrayA[1], arrayA[2]);

/*打印结果:

前:arrayA[1]=3 arrayA[2]=2

++(*p1++)=3 ++*p1++=4 *p1=3

后:arrayA[1]=4 arrayA[2]=3

分析:先执行++*p1++:后缀运算符的优先级高于前缀运算符,所以p1++先结合,返回p1指向的地址和*

结合后再和前面的++结合将该地址的值自增运算,即将arrayA[1]中的数由3变为4,执行完后p1指向&arrayA[2]

再执行++(*p1++):()的优先级最高,先执行(*p1++),因()中后缀运算符++的优先级高于*,

p1++先结合,先取值后自增,(*p1++)先取arrayA[2]地址中的值为2,在和前面的++结合将

该地址的自增运算后变为3.

*/

return 0;

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。