n4nnn输出n是多少?
一眼看上去,心里一万个马奔腾相信大家平时都不会写这样的代码吧(后面看代码的人会骂娘)
首先,要知道这个表达式的输出值,需要了解CC语言运算符优先级和自增表达式:
(1)运算符优先级
优先级
运算符
结合性
1hr()〔〕。
从左到右
2hr!(正)(负)~
从右到左
3hr
从左到右
4hr(加)(减)
从左到右
5hr
从左到右
6hr
从左到右
7hr!
从左到右
8hr(按位与)
从左到右
9hr
从左到右
10hr
从左到右
11hr
从左到右
12hr
从左到右
13hr?:
从右到左
14hr
从右到左
(2)自增表达式n:n递增加1,n表达式返回n的原始值(加1前值)n:n递增加1,n表达式返回n的新值(加1后的值)
有了上面的知识后,我们就很轻松得到n的值:
includeiostreamincludestringincludevectorintmain(){intn4;nnn;std::coutnnstd::endl;return0;}
n11
为什么是上面的值?所有平台都是11吗?
这实际和编译器有关,实际上编译器处理比较复杂,还会对代码进行优化,这里就手动写下上面的汇编伪代码,剖析内在原理:;汇编代码使用;注释;n4movn(addr),0x4;n(第一次n自增1)addn(addr),0x1;第一次n表达式值放到寄存器eax中moveax,n(addr);n(第二次n增1)addn(addr),0x1;第二次n表达式值放到寄存器ebx中movebx,n(addr);eaxeaxebxaddeax,ebx;neaxmovn(addr),eax
由于cc编译器在不同平台编译代码都是以上的逻辑,所以在其他平台上运行结果是相同的