n=4;n = ++n + ++n; 输出n是多少?

一眼看上去,心里一万个马奔腾。。相信大家平时都不会写这样的代码吧(后面看代码的人会骂娘)

首先,要知道这个表达式的输出值,需要了解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

标签:寄存器   优先级   编译器   表达式   注释   逻辑   原始   平时   代码   平台

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top