为什么(++a)+(++a)=14

世上唯一不能复制的是时间,唯一不能重演的是人生,唯一不劳而获的是年龄。该怎么走,过什么样的生活,全凭自己的选择和努力。人生很贵,请别浪费!与智者为伍,与良善者同行。为什么(++a)+(++a)=14,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

概述

今天有学妹问我,下面这个代码为啥结果是14

int a=5;
printf("%d\n",(++a)+(++a));

我一看,第一眼看上去,结果应该是13才对啊… 也即是

5自增1 = 6

6自增1 = 7

最后 6+7 = 13

但是为啥是14呢,题目错误了嘛?

验证

image-20200310111756307

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… 那这个问题可能… 就是编译器的锅吧,不只是优先级的问题这么简单,

反编译大法


  1. 首先,先这么写代码,然后运行结果是14

image-20200310112346553

  1. 这里通过objdump -S a.out命令查看一下汇编代码,结果如下

image-20200310112259772

  1. 这里可以看到 在652一行中,将5赋值给-0x8(%rbp)(简称rbp好了)
  2. 然后给rbp加一
  3. 然后再给rbp加一
  4. 然后将rbp赋值给eax寄存器
  5. eax+eax
  6. 到这里,应该就明白了,这么算的话,结果确实是14,那编译器为啥会这么做,应该就是编译器优化的问题吧(bug~ (→_→))。
  7. 对了,我考虑到是不是操作系统不一样结果也不一样,vs2019得出的结果也是14 啧….

Java

然后试试Java的结果呢?

image-20200310113943793

反编译结果

image-20200310125601777

可见 大概只有C或者C++会这么解释这个问题

最后,出这题的人…

总之实际写代码的话 肯定不会这么写的吧…

测试

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/225593.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!