概述

今天有学妹问我,下面这个代码为啥结果是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... 那这个问题可能... 就是编译器的锅吧,不只是优先级的问题这么简单,

反编译大法


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

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

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

Java

然后试试Java的结果呢?

反编译结果

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

最后,出这题的人...

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

测试

为什么(++a)+(++a)=14的更多相关文章

  1. Ubuntu 14.04中Elasticsearch集群配置

    Ubuntu 14.04中Elasticsearch集群配置 前言:本文可用于elasticsearch集群搭建参考.细分为elasticsearch.yml配置和系统配置 达到的目的:各台机器配置成 ...

  2. IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)

    首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...

  3. Angular2 Hello World 之 2.0.0-beta.14

    公司现在采用angualrjs开发一些web应用,采用的是angular1,现在angular2已经差不多了,听说最近rc6已经出来了……其实感觉好慢啊!之前也做过一些anglar2的例子,但是没有记 ...

  4. 14门Linux课程,打通你Linux的任督二脉!

    Linux有很多优点:安全.自主.开源--,也正是这些优点使得很多人都在学Linux. 虽说网上有大把的Linux课程资源,但是对很多小白来说网上的课程资源比较零散并不适合新手学习. 正因为此,总结了 ...

  5. deepsooncms在Ubuntu 14.04上部署教程

    deepsooncms在Ubuntu 14.04上部署教程 一.安装mono1.在命令行运行sudo apt-key adv --keyserver keyserver.ubuntu.com --re ...

  6. ubuntu 14.10 lts 64-bits环境下使用Android Studio

    距离google发布android studio 1.0正式版已经两个月左右了.由于一直习惯使用eclipse+ADT的模式,而且曾在windows下试用一次Android Studio预览版,感觉卡 ...

  7. 在 Ubuntu 14.10 中借用 Windows 的字体

    在前一篇随笔中,我详细讨论了字体的分类及用途,也以 Fedora 20 为例,展示了字体配置的思路和方法.我在配置 Fedora 20 系统字体的时候,采用的是一种釜底抽薪的方法,完全抛开了系统原有的 ...

  8. 转-基于NodeJS的14款Web框架

    基于NodeJS的14款Web框架 2014-10-16 23:28 作者: NodeJSNet 来源: 本站 浏览: 1,399 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里 ...

  9. CSharpGL(14)用geometry shader渲染模型的法线(normal)

    +BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(14)用geometry shader渲染模型的法线(normal) +BIT祝威+悄悄在此留下版了个权的信息说: 2016-08-13 ...

  10. ABP(现代ASP.NET样板开发框架)系列之14、ABP领域层——领域事件(Domain events)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之14.ABP领域层——领域事件(Domain events) ABP是“ASP.NET Boilerplate P ...

随机推荐

  1. echarts定义饼状图的指向线内容

    定义饼状图的指向线内容 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  2. 英伟达系列显卡大解析B100、H200、L40S、A100、A800、H100、H800、V100如何选择,含架构技术和性能对比带你解决疑惑

    英伟达系列显卡大解析B100.H200.L40S.A100.A800.H100.H800.V100如何选择,含架构技术和性能对比带你解决疑惑 近期,AIGC领域呈现出一片繁荣景象,其背后离不开强大算力 ...

  3. C/C++ 类与构造析构等知识

    简单定义类 #include <iostream> #include <string> using namespace std; class Student { public: ...

  4. Properties集合的使用

    Properties集合是唯一一个可以和IO流相结合的集合 可以将集合中的数据持久化存储,也可以将硬盘上的数据加载到该集合中. 1 Properties集合添加.遍历 1 private static ...

  5. requests模块的高级应用

    requests抓取数据报错 - HttpConnectinPool: - 原因: - 1.短时间内发起了高频的请求导致ip被禁 - 2.http连接池中的连接资源被耗尽 - 解决: - 1.代理 - ...

  6. 14代i5-14600K现身:多核性能提升多达11%

    14代酷睿桌面端还未发售,就陆续在跑分平台上露出. 平台规格为Z790主板.32GB DDR5-5200内存,酷睿i5-14600K的单核成绩为2819,多核成绩为16666,对比酷睿i5-13600 ...

  7. blazor maui hybrid app显示本地图片

    啊... ... 一通操作下来感觉就是两个字 折磨 跨平台有跨平台的好处 但框架本身支持的有限 很多东西做起来很曲折 哎 这里总结一下笔者为了折腾本地图片显示的尝试 为什么要做本地图片展示呢 如果是做 ...

  8. 2023年多校联训NOIP层测试1

    2023年多校联训NOIP层测试1 T1 luogu P6882 [COCI2016-2017#3] Imena \(50pts\) 赛场上被如何输入和判断是否合法薄纱了,赛后发现还有数字这一说,而且 ...

  9. NC20545 [HEOI2012]采花

    题目链接 题目 题目描述 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花. 花园足够大,容纳了 \(n\) 朵花,花有 \(c\) 种颜色(用整 ...

  10. Swoole从入门到入土(14)——HTTP服务器[协程风格]

    在这之间,我们讨论了异步风格HTTP服务器,它继承自异步风格的TCP服务器,有着异步风格的所有优点,同时如果碰到了大量的IO等待也会存在阻塞的缺点. 而协程风格的HTTP则很好处理了IO等待的问题.这 ...