*p++的运算顺序

本文详细解析了一道关于C++程序输出结果的笔试题,解答了初学者易犯的错误,介绍了正确的运算顺序和程序执行流程。

在论坛上看到这样一道笔试题:

以下程序输出结果是: 
  
#include <stdio.h> 
  
int main() 
{ 
int cnt = 10; 
char *p = "welcome"; 
while(*p++) 
{ 
cnt++ 
} 
printf("%d/n", cnt); 
} 
  
答案:17 

我刚开始的理解是先进行++运算,然后取其值,得到结果是16.

其实真正的运算顺序应该是:先取出p的值,再进行++运算。

### 关于 `p++` 自增运算符的优级 在 C/C++ 中,后置自增运算符 (`p++`) 的优级高于赋值运算符 (`=`),但低于解引用运算符 (`*`) 和前置自增运算符 (`++p`)。这意味着当涉及到指针变量时,表达式的求值顺序会受到这些优级的影响。 #### 后置自增运算符的行为 后置自增运算符的作用是对变量返回其当前值,然后再执行加一操作。具体来说,在涉及指针的情况下: - 如果有一个指针变量 `p` 并对其进行后置自增操作(即 `p++`),那么该操作会在返回 `p` 当前指向的内容之后再使指针移动到下一个位置。 - 解引用运算符 `*` 的优级高于后置自增运算符 `p++`,因此在表达式 `*p++` 中,首会对 `p` 所指向的位置进行解引用,然后才对 `p` 进行自增[^3]。 以下是具体的例子来说明这一行为: ```c #include <stdio.h> int main() { int arr[] = {1, 2, 3}; int *p = arr; int value = *p++; // 此处取 p 指向的值 (arr[0]),然后 p 增加至指向 arr[1] printf("value: %d\n", value); // 输出 1 printf("*p: %d\n", *p); // 输出 2 return 0; } ``` 在这个代码片段中,`*p++` 表达式的计过程如下: 1. 首通过 `*p` 取得数组的第一个元素 `arr[0]` 的值并将其存储给变量 `value`; 2. 接着由于 `p++` 是后置自增,所以此时才会更新指针 `p` 到下一位,也就是让 `p` 指向 `arr[1]`。 #### 结合性影响 需要注意的是,虽然解引用运算符 `*` 的优级较高,但在某些情况下还需要考虑结合性的方向。例如对于前置自增运算符而言,它与解引用运算符具有相同的优级,但是它们是从右往左结合的,这决定了不同的解析方式[^3]。 ### 总结 综上所述,C/C++ 中后置自增运算符 `p++` 的优级较低,通常位于大多数其他二元或单目运算符之下;而在遇到像 `*p++` 这样的组合形式时,则应按照各自的操作数关联规则依次处理每一个部分。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值