
先来看几个问题
问题1
1 | int a = 3; |
问题2
1 | int a = 3; |
问题3
1 | int a = 3; |
问题4
1 | int a = 3; |
学习EAX、EBX、ECX和EDX寄存器的用途
(1)EAX寄存器:EAX称为累加器,常用于算数运算、布尔操作、逻辑操作、返回函数结果等。
(2)EBX寄存器:EBX称为基址寄存器,常用于存档内存地址。
(3)ECX寄存器:ECX称为计数寄存器,常用于存放循环语句的循环次数,字符串操作中也常用。
(4)EDX寄存器:称为数据寄存器,常常和EAX一起使用。
问题1
int a = 3;
int b = a++ + a++;
1 | main: |
结果输出 7
问题2
int a = 3;
int b = a++ + ++a;
1 | main: |
结果输出 8
问题3
int a = 3;
int b = ++a + a++;
1 | main: |
结果输出9
为什么会得到 9?
这里的关键是编译器在处理 ++a + a++ 时,将 a++ 计算成了 5 而不是 4。我们通常期望 a++ 返回自增前的值,也就是 4,但在你的汇编代码中,编译器似乎在计算右边的 a++ 时直接使用了 a 当前自增后的值 5。
原因总结:
C 语言的表达式求值顺序未定义,在这种复杂表达式(尤其包含自增、自减的情况)中,编译器的行为可以有所不同。不同的编译器,甚至同一编译器在不同的优化设置下,可能会产生不同的结果。
在你的汇编代码中,编译器在计算 ++a + a++ 时,似乎使用了 a 在自增后的值 5,而不是预期中的自增前值 4。
结论:
你的编译器处理 ++a + a++ 时返回了 9,因为在这个实现中,a++ 计算为了 5 而不是预期的 4。这与编译器的优化和求值顺序有关。
问题4
int a = 3;
int b = ++a + ++a;
1 | main: |
结果输出10
5 补充问题
int a = 3;
int b = ++a;
int c = a++;
printf(“%d,%d”, b, c);
1 | main: |
输出4,4
总结
顺序 | 结果 | 解释 | 备注 |
---|---|---|---|
int b = a++ + a++; | 7 | 3+4 | 比较好理解 |
int b = a++ + ++a; | 8 | 3+5 | 比较好理解 |
int b = ++a + a++; | 9 | 4+5 | 很难理解,理论上是4+4,可能是编译器未知行为 |
int b = ++a + ++a; | 10 | 5+5 | 比较难理解,理论上是4+5,可能是编译器未知行为 |