为什么(++a)+(++a)=14
概述
今天有学妹问我,下面这个代码为啥结果是14
int a=5;
printf("%d\n",(++a)+(++a));
我一看,第一眼看上去,结果应该是13才对啊... 也即是
5自增1 = 6
6自增1 = 7
最后 6+7 = 13
但是为啥是14呢,题目错误了嘛?
验证
emmmm....
太神奇了,然后我试图通过优先级的角度解释这个问题,
因为算式中出现了括号,那么优先算括号,也即是
a = 5;
第一个括号 a自增为6
第二个括号 a自增为7
最后两个a相加 7+7 = 14
好像可以解释了哎...
但是总感觉逻辑不对啊... 如果我就是要表示 a自增之后的值
再加上a自增之后的值
怎么办?(咳 可以分别给两个变量哎。。。)
#include <stdio.h>
int main()
{
int a=5;
int b=++a;
int c=++a;
int d=b+c;
printf("%d\n",d); //这样写结果是13
return 0;
}
此时,朋友使用JavaScript 也验证了一下,无论如何,结果都是13... 那这个问题可能... 就是编译器的锅吧,不只是优先级的问题这么简单,
反编译大法
- 首先,先这么写代码,然后运行结果是
14
- 这里通过
objdump -S a.out
命令查看一下汇编代码,结果如下
- 这里可以看到 在652一行中,将5赋值给
-0x8(%rbp)
(简称rbp好了) - 然后给
rbp
加一 - 然后再给
rbp
加一 - 然后将
rbp
赋值给eax
寄存器 eax
+eax
- 到这里,应该就明白了,这么算的话,结果确实是
14
,那编译器为啥会这么做,应该就是编译器优化的问题吧(bug~ (→_→))。 - 对了,我考虑到是不是操作系统不一样结果也不一样,vs2019得出的结果也是14 啧....
Java
然后试试Java的结果呢?
反编译结果
可见 大概只有C或者C++会这么解释这个问题
最后,出这题的人...
总之实际写代码的话 肯定不会这么写的吧...