运算符与指针优先级疑问:++*--p与++*p--的区别
C语言指针操作表达式疑问
原问题代码
int main() { int a[4] = { 10, 21, 32, 43}; int *p = a + 3; ++*--p; ++*p--; p[2] += p[1]; for (int i = 0; i < 4; ++i) printf("%d\t", a[i]); return 0; }
输出结果
10 21 34 77
疑问点
我大部分内容都理解了,但有一点困惑:++*--p 和 ++*p-- 之间有什么区别?
这两个表达式难道不应该得到相同结果吗?因为在我使用的Code::Blocks编译器中,*p-- 和 *--p 的结果是相同的。
解析
要搞懂这两个表达式的区别,得拆解运算符的优先级和执行顺序:
1. 表达式 ++*--p 的执行步骤
运算符优先级:前缀-- > 解引用* > 前缀++,结合性从右到左:
- 第一步:
--p:指针p先向左移动一位(指向数组的前一个元素),返回移动后的指针 - 第二步:
*--p:解引用移动后的指针,得到对应元素的值 - 第三步:
++*--p:对这个值做前缀自增,元素值加1 - 执行后,
p停在移动后的位置
2. 表达式 ++*p-- 的执行步骤
运算符优先级:后缀-- > 解引用* > 前缀++:
- 第一步:
p--:先返回p当前指向的指针(不移动),然后再把p向左移动一位 - 第二步:
*p--:解引用原本的指针,得到当前元素的值 - 第三步:
++*p--:对这个值做前缀自增,元素值加1 - 执行后,
p停在移动后的位置
结合原代码的具体执行
初始状态:p指向a[3](值43)
- 执行
++*--p:p先移到a[2](值32),解引用得到32,自增后a[2]变成33,此时p指向a[2]
- 执行
++*p--:- 先解引用
p当前指向的a[2](值33),自增后a[2]变成34,然后p移到a[1]
- 先解引用
你觉得*p--和*--p结果相同,大概率是测试场景的巧合——比如你测试时,p指向的元素和它前一个元素的值刚好相等,导致取值结果看起来一致,但本质上:
*--p是先移指针再取值,取的是前一个元素的值*p--是先取当前值再移指针,取的是原本指向的元素的值
内容的提问来源于stack exchange,提问作者Baran Kanat
相关产品推荐
相关产品推荐

