【编译原理】对++*p++操作理解

目录

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张图片

1. (p++)操作:将p指针的地址后移四位。

【编译原理】对++*p++操作理解_第3张图片

2. (*(p++))操作:解析原来i的地址(因为p++这一式子返回的结果仍是p的原地址)。

例如:

# include 
using namespace std;
int main()
{
	int i = 0;
	int* p = &i;
	cout << p << endl;
	cout << p++ << endl;
	return 0;
}

执行结果为:

00000053456FF674
00000053456FF674 

【编译原理】对++*p++操作理解_第4张图片

3. (++(*(p++)))操作:对 i 地址上的值进行了加一操作。

【编译原理】对++*p++操作理解_第5张图片

你可能感兴趣的:(汇编,c语言)