目录
1. 代码段执行结果
2. ++*p++的结合过程
3. 通过汇编代码判断执行结果
1. 代码段执行结果
对于以下代码:
int main()
{
int i = 0;
int *p = &i;
++ *p ++;
return i;
}
输出结果为:
ASM generation compiler returned: 0
Execution build compiler returned: 0
Program returned: 1 // 返回的结果为1
2. ++*p++的结合过程
C语言中的优先级与结合性:
优先级 | 运算符 | 含义 | 结合性 |
1 | :: | 域运算符 | 左结合 |
2 | ( ) [ ] -> . ++ -- | 括号,函数调用 数组下标运算符 指向成员运算符 成员运算符 自增运算符(后置)(单目运算符) 自减运算符(后置)(单目运算符) | 左结合 |
3 | ++ -- ~ ! - + * & (类型) sizeof new delete | (以下均为单目运算符) 自增运算符(前置) 自减运算符(前置) 按位取反运算符 逻辑非运算符 负号运算符 正号运算符 指针运算符 取地址运算符 类型转换运算符 长度运算符 动态分配空间运算符 释放空间运算符 | 右结合 |
4 | * / % | 乘法运算符 除法运算符 求余运算符 | 左结合 |
5 | + - | 加法运算符 减法运算符 | 左结合 |
6 | << >> | 按位左移运算符 按位右移运算符 | 左结合 |
7 | < <= > >= | 关系运算符 | 左结合 |
8 | == != | 等于运算符 不等于运算符 | 左结合 |
9 | & | 按位与运算 | 左结合 |
10 | ^ | 按位异或运算符 | 左结合 |
11 | | | 按位或运算 | 左结合 |
12 | && | 逻辑与运算符 | 左结合 |
13 | || | 逻辑或运算符 | 左结合 |
14 | ? : | 条件运算符(三目运算符) | 右结合 |
15 | = += -= *= /= %= >>= <<= &= ^= != | 赋值运算符 | 右结合 |
16 | throw | 抛出异常运算符 | 右结合 |
17 | , | 逗号运算符 | 左结合 |
根据C语言的优先级与结合性可知++*p++的结合过程有三步:
- 自增运算符(后置)优先级最高,且为左结合,所以有:(p++)
- 自增运算符(前置)与指针运算符优先级相同,但为右结合,所以有:(*(p++))
- 最后有:(++(*(p++)))
3. 通过汇编代码判断执行结果
编译网站:Compiler Explorer
整体代码段:
其中对++*p++的汇编过程为:
1. (p++)操作:将p指针的地址后移四位。
2. (*(p++))操作:解析原来i的地址(因为p++这一式子返回的结果仍是p的原地址)。
例如:
# include <iostream>
using namespace std;
int main()
{
int i = 0;
int* p = &i;
cout << p << endl;
cout << p++ << endl;
return 0;
}
执行结果为:
00000053456FF674
00000053456FF674
3. (++(*(p++)))操作:对 i 地址上的值进行了加一操作。