zoukankan      html  css  js  c++  java
  • 为什么(++a)+(++a)=14

    概述

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

    int a=5;
    printf("%d
    ",(++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
    ",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++会这么解释这个问题

    最后,出这题的人...

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

    测试

  • 相关阅读:
    233
    膝为筋之府
    AES 可逆性加密算法
    DES 可逆性加密算法
    Java Swing如何让窗体居中显示
    eclipse 安装插件
    eclipse 搭建Swt 环境
    Java Set元素比较
    Greenplum数据库中系统表gp_ distribution_ policy详解
    Greenplum数据库中系统表pg_class详解
  • 原文地址:https://www.cnblogs.com/cjdty/p/12455064.html
Copyright © 2011-2022 走看看