版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29567701/article/details/82721745
指针运算拾遗
如有错误,欢迎指正。
如若转载,请声明原创:https://blog.csdn.net/qq_29567701/article/details/82721745
一、*p + *p++ + *++p;
题目:
int a[] = { 1, 2, 3, 4, 5 };
int *p = a;
int result = *p + *p++ + *++p;
cout << result << endl;
结果:6
分析如下:
1、 C++运算符优先级:
优先级 Top2: -(负号运算符)、++(前置++或后置++)、–(前置–或后置–)、*(指针取值运算符)、&(取地址运算符) 一个级别,遇到后,从左向右运算
注意其中,++和–,比 * 优先级高
优先级 Top3: /、*(乘)、%
优先级 Top4: +、-(减法运算符)
优先级 Top8: &(按位与)、|、^
2、*p + *p++ + *++p;
(1) 先做优先级高的运算: ++
从左向右:
p++ ,只有此轮循环结束之后,p才指向下一个,故还指向当前值 1
++p ,指针p先指向下一位在做运算 p指向2;
此时,表达式相当于:优先级如下:1,2,3...优先级递减
(*p) + (*(p++)) + (*(++p));
1 1
2 2 2
3 3
注意此时,*p + *p++ + *++p; 表达式中所有的 指针p 都指向了2
(2) 再做Top2中的次优先级:*(指针取值运算符)
*p =2
*p++ =2
*++p =2
故最终的结果为2+2+2=6;
二、++*p++;
题目:
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
int*p = a + 4;
int b = 4 + ++*p++;
cout << b << endl;
结果:10
分析如下:
4 + ++*p++; 相当于 4 + ( ++*p++ );
分析 ++*p++:
前置++和后置++是同一个优先级,故从左向右运算
*(取值算符)虽然也是 Top2的优先级,但是却比++运算符优先级低
(1)故先运算++p++
之前,int*p = a + 4; //p初始指向了5
(1.1)++p之后,p指向了6
(1.2)后置运算符++,在此行运算结束之后,才起作用,程序运行到下一行之后,p才会指向 7
(2)再运算 *(指针取值运算符),取出 6
故此时 ++*p++; 结果为 6
故 4 + ++*p++; 结果为 4+6=10;