一眼看上去,心里一万个马奔腾。。相信大家平时都不会写这样的代码吧(后面看代码的人会骂娘)
首先,要知道这个表达式的输出值,需要了解C/C++语言运算符优先级和自增表达式:
(1)运算符优先级
优先级 | 运算符 | 结合性 |
1 | () [] . | 从左到右 |
2 | ! +(正) -(负) ~ ++ -- | 从右到左 |
3 | * / % | 从左到右 |
4 | +(加) -(减) | 从左到右 |
5 | << >> >>> | 从左到右 |
6 | < <= >= | 从左到右 |
7 | == != | 从左到右 |
8 | &(按位与) | 从左到右 |
9 | ^ | 从左到右 |
10 | | | 从左到右 |
11 | && | 从左到右 |
12 | || | 从左到右 |
13 | ?: | 从右到左 |
14 | = += *= /= %= &= ^= ~= <<= >>= >>>= | 从右到左 |
(2)自增表达式
有了上面的知识后,我们就很轻松得到n的值:
#include
#include
#include
int main() {
int n = 4;
n = ++n + ++n;
std::cout << "n=" << n << std::endl;
return 0;
}
n=11
为什么是上面的值?所有平台都是11吗?
这实际和编译器有关,实际上编译器处理比较复杂,还会对代码进行优化,这里就手动写下上面的汇编伪代码,剖析内在原理:
; 汇编代码使用;注释
; n = 4
mov n(addr), 0x4
; ++n (第一次n自增1)
add n(addr), 0x1
; 第一次++n 表达式值 放到寄存器 eax中
mov eax, n(addr)
; ++n (第二次n增1)
add n(addr), 0x1
; 第二次++n 表达式值 放到寄存器 ebx中
mov ebx, n(addr)
; eax = eax + ebx
add eax, ebx
; n = eax
mov n(addr), eax
由于c/c++编译器在不同平台编译代码都是以上的逻辑,所以在其他平台上运行结果是相同的
页面更新:2024-04-10
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号