范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

C语言ampampampJava解析当ii后,结果究竟是什么?

  前言:
  之前有朋友跟我讨论过一个问题,他问在java中,i=1;i=i++;之后的结果是什么,我一开始认为是2,但当他说答案是1的时候,我不得不想一个合理的解释,我想,可能是因为临时变量,当i赋值给i后,自增更改了临时变量,所以i值并没有改变。当我在为我的解释表示满意时,他们说在c语言下的答案是2,好吧,我只能说是编译器的实现不同,当然这个答案太没说服力了,所以寻找答案的任务就开始了。
  我先在《c++ primer》上看见这样的解释:"++i的效率要比i++的效率高,因为i++必须要有一个临时变量来存放i本身的值",那么我之前只说对了临时变量,但原因是临时变量先用来存放i的值,然后i本身自增,之后,临时变量赋值给左边,这时,i的值又被 自己之前的值覆盖了,所以又变成1,但这只是个推测,再说c语言中为什么是2?所以不得不反编译了…
  java的jdk自带一个工具,javap,可以反编译,我们用它java编译器生成的"jvm版汇编码",我会写下两段代码用来做对比,一种是i=i++;一种常见的j=i++;注意,我使用2作为初始值(也就是说它会被自增为3),因为1太特殊了,它在字节码中的变量名随处可见,而且++不是加1么,所以我用2做初值,也方便查找。 publicclassTest{  publicstaticvoidmain(String[] args){  inti =2;  i = i++;  System.out.println(i);  }  }
  javap -c Test 的字节码如下: public class Test extends java.lang.Object{  public Test();  Code:  0: aload_0  1: invokespecial #1; //Method java/lang/Object."":()V  4: return  public static void main(java.lang.String[]);  Code:  0: iconst_2  1: istore_1  2: iload_1  3: iinc 1, 1  6: istore_1  7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;  10: iload_1  11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V  14: return  }0: iconst_2 //将int型的常量2压栈  1: istore_1 //将int型值存入变量1中
  就是定义并初始化i的值。
  关键是这里: 2: iload_1 //保存变量1的值  3: iinc 1, 1 //将变量1的值自增(i现在是3了)  6: istore //将之前的保存值放入变量i中(i现在又变成2了…)
  其实在2: iload_1 时,i变量的值被放在了栈中,这就是我们说的临时存储…之后,又被赋了过来
  看看Test2,你就会明白正常的运作: publicclassTest2{  publicstaticvoidmain(String[] args){  inti =2;  intj =0;  j = i++;  System.out.println(j);  }  }
  javap -c Test2 的字节码如下: public class Test2 extends java.lang.Object{  public Test2();  Code:  0: aload_0  1: invokespecial #1; //Method java/lang/Object."":()V  4: return  public static void main(java.lang.String[]);  Code:  0: iconst_2  1: istore_1  2: iconst_0  3: istore_2  4: iload_1  5: iinc 1, 1  8: istore_2  9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;  12: iload_2  13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V  16: return  }4: iload_1 //变量1的值被保存(入栈)  5: iinc 1,1 //i自增  8 istore_2 // 弹栈,赋值给变量2.…
  现在明白了吧,,到底发生了什么…
  但是还没完,,,,,我们还没解释在c语言中发生了什么…
  在gcc中,编译一个c程序要四个阶段,预处理,编译,汇编,链接。我们在编译阶段后停下,这样会得到AT&T的汇编码,
  我们写下两种代码,类似于java版
  先看正常情况: #include  intmain()  {  inti =2;  intj =0;  j = i++;  printf("j = %d ",j);  return0;  }
  编译成汇编码: .file"test.c"  .section .rodata  .LC0:  .string"j = %d "  .text  .globl main  .typemain, @function  main:  pushl %ebp  movl %esp, %ebp  andl $-16, %esp  subl$32, %esp  movl$2, 28(%esp)  movl$0, 24(%esp)  movl 28(%esp), %eax  movl %eax, 24(%esp)  addl$1, 28(%esp)  movl $.LC0, %eax  movl 24(%esp), %edx  movl %edx, 4(%esp)  movl %eax, (%esp)  callprintf  movl$0, %eax  leave  ret  .size main, .-main  .ident"GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"  .section.note.GNU-stack,"",@progbits
  包括 movl $.LC0, %eax 和之后语句的都和输出有关了。
  我们再把初始化有关的除去,关键的部分是: movl 28(%esp), %eax  movl %eax, 24(%esp)  addl$1, 28(%esp)
  保存了i的值,(放在eax中),之后又放入j中,i再自增,这就很符合大家心里的答案,那么如果是i=i++时自然就是i被赋值,再自增…也就是大家心中的答案了,但是真是这样么?我们继续看… #include  intmain()  {  inti =2;  i = i++;  printf("i = %d ",i);  return0;  }
  对应的汇编码: .file"test2.c"  .section .rodata  .LC0:  .string"i = %d "  .text  .globl main  .typemain, @function  main:  pushl %ebp  movl %esp, %ebp  andl $-16, %esp  subl$32, %esp  movl$2, 28(%esp)  addl$1, 28(%esp)  movl $.LC0, %eax  movl 28(%esp), %edx  movl %edx, 4(%esp)  movl %eax, (%esp)  callprintf  movl$0, %eax  leave  ret  .size main, .-main  .ident"GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"  .section.note.GNU-stack,"",@progbits
  关键部分就省一句了 addl $1, 28(%esp)这简直就是…看我的test3.c吧… #include  intmain()  {  inti =2;  i++;  printf("i = %d ",i);  return0;  }
  产生的汇编码: aiqier@aiqier-laptop:~/c/test3$ cat test3.s
  .file"test3.c"  .section .rodata  .LC0:  .string"i = %d "  .text  .globl main  .typemain, @function  main:  pushl %ebp  movl %esp, %ebp  andl $-16, %esp  subl$32, %esp  movl$2, 28(%esp)  addl$1, 28(%esp)  movl $.LC0, %eax  movl 28(%esp), %edx  movl %edx, 4(%esp)  movl %eax, (%esp)  callprintf  movl$0, %eax  leave  ret  .size main, .-main  .ident"GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"  .section.note.GNU-stack,"",@progbits
  恩,在c语言中i=i++;居然跟i++;的汇编代码一样,按正常的逻辑(我们之前的分析),i=2;i=i++;i的值是3,已经没问题了,但是gcc会对编译器做一些优化,所以保存i的值,再赋值给i,这两条语句自然是鸡肋了,就被优化掉了。
  总结,我们发现对于i++保存的临时值,java中是自增在返回临时值,而c语言中是返回临时值后,在自增,所以这就是为什么i=i++在这两种语言中不同的结果了,c#我就不知道了,有兴趣的同学可以试试,python么,没有++啦,呵呵,如果我的分析有什么不对之初,希望能与你一起探讨。
  另外,对现在我们的大多数朋友来说还是学编程技术最重要!栽一棵树最好的时间是十年前,其次是现在。对于准备学习编程的小伙伴,如果你想更好地提升你的编程核心能力(内功)不妨从现在开始!
  编程学习书籍分享:
  编程学习视频分享:
  整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
  欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
  对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

广州最后一个限制外出小区鹤园小区解封广州最后一个限制外出小区鹤园小区解封6月30日,广州市荔湾区新型冠状病毒肺炎疫情防控指挥部发布荔湾区鹤园小区分级分类防控措施称,即日起恢复鹤园小区对外人员和交通通行,这意味着时隔一替代原配,小巧便携一个就够Magcube65W氮化镓快充充电器今年刚刚换了一部支持65W快充的手机,再用普通的充电头确实不能满足我的需求,充电又慢还有发烫的现象。无可奈何,平时无论去哪只能背着原配充电头到处跑。为此就想着入手一款好用的大功率快双摄双屏,独有AI算法,努比亚X成最强拍摄神器继2015年无边框手机努比亚Z9发布之后,各大手机厂商不断探索全面屏设计,相继出现189全面屏刘海屏水滴屏,手机行业正在向更加极致的全面屏发展。努比亚X是努比亚的六周年诚意之作,是谁是最强处理器?雷军坚信小米10选高通865最好,高通总裁站台小米10在2月13日的纯线上发布会即将来临,然而对于小米10宣称的安卓最强平台,业界还是出现了不少不同的声音。只是小米10毕竟还是第一款能够买到的骁龙865处理器手机,那么雷军的自探路者携中国最强越野跑队伍推出UTMB同款碳板超轻跑鞋飞越队被誉为中国最强的越野跑队伍,是由中国户外品牌的领头羊探路者所组建,聚集了国内越野跑的顶尖高手。近几年来,在一些世界级高水平越野跑的大舞台上也取得过傲人的成绩。那么在这些成绩下配件验货需断魂北京现代相对于定损其他方面,汽车配件确实让人头疼,汽车配件的水很深,大家应该都有所了解,但还是防不胜防。今天遇到了一个现代验货的案例,包装有点瑕疵,有点离谱,特地拿出来解析一番。水箱框架标服务站要价1520,找修理厂20元搞定案件详情近期一同事接到一笔客户报案,自己的车停放不明原因受损,两个面轻微钣金油漆。非常委屈的同时,还是向保险公司报了保险。同事接到报案后立即进行受理,线上理赔最终协商去服务站定损。一键倾心!支持双模式兼容多系统的A4Tech双飞燕鼠键装体验鼠标和键盘作为现代办公和娱乐中用于操作设备运行的输入装置,一直扮演着不可替代的角色,相对于以往传统的机械鼠键搭配,支持双模无线连接兼容多种操作系统颜值更高操作体验更优的升级版键盘和重磅,新能源汽车保险专属条款即将来临(先睹为快,看看靓点)根据中国银保监会关于印发实施车险综合改革指导意见的通知精神,为贯彻以人民为中心的发展思想和高质量发展要求,深化车险市场供给侧结构性改革,在中国银保监会的指导下,中国保险行业协会(以营养美味不将就,一盒8用的蒸汽饭盒是怎样的体验?生活节奏的加速,让很多时候花些功夫用在烹饪上会成为了一种奢侈特别是很多上班族的朋友,午餐往往简单将就一下,对营养更是丢失了要求。生活可以偶尔将就,但久而久之带来的健康隐患不言而喻。每秒40Gbit极速传输的USB4。0,相比雷电3有多强?基于雷电3协议进行开发的USB4。0早已不再神秘,它不仅能够支持高速数据传输和视频音频传输,而且还能具有DPHDMIDVIVGA等功能USB4。0TypeC接口可以完全替代当前主板
朋友圈文案微信置顶文案1今天你快乐了吗。2什么都明白的人最温柔也最冷漠。3别急着失望总有人跨越山海为你而来4好好生活慢慢相遇5别让平凡的生活耗尽你对生活的向往。6再相逢希望我们都在高处7在意那么多我还怎网络直播镜头下的中年人,讨生活的样子真像一条狗在早期的娱乐直播游戏直播旅游直播等,电商直播进一步成为直播届的主流。淘宝抖音腾讯快手等纷纷入场,力图占据市场主力。直播平台通过网红内容吸引聚集广大网友的社交流量,结合传统电商供应链星融网探索未来天地一体化的互联网络空间这是一篇关于天地一体化信息网络空间探索的科普小文,引出人类对空间信息网络的探索,介绍了星链鸿雁虹云等星基网络,未来天地一体化的星融网,以及我国星融网发展情况。什么是未来天地一体化的买灯送车,买月影家居张继科壕送宏光miniEV!让家充满爱新手小白在面临装修时是不是都一头雾水?尤其是灯具的选择时,超多的样式摆在面前,挑的头都大了!!今天给各位姐妹安利一下我自己家用的灯饰!月影家居品牌的1999元全屋铜灯套餐!!你没有茂名知名富豪掌舵香港最大的镍钴贸易企业,如今身价百亿茂名知名富豪掌舵香港最大的镍钴贸易企业,如今身价百亿推荐语茂名,广东省地级市,是一座拥有全地形特征的中国优秀旅游城市,北有高山草甸原始森林,南有百里银滩千年渔港,再加上温泉农业人文合江第一富豪打造贵州地产龙头企业,如今身价百亿合江第一富豪打造贵州地产龙头企业,如今身价百亿推荐语合江县,隶属四川省泸州市,是长江上游置县最早的三个县之一长江出川第一港口县。除此之外,合江县景色秀美,有多处国家级森林公园省级风中国直播界女首富诞生白手起家创业,如今坐拥90亿财富中国直播界女首富出现白手起家创业,如今坐拥90亿财富推荐语虽然如今距离双11还有十几天二十天的时间,但今年各大电商平台一改往日的营销策略,将双十一战线拉长,早早就开始了一系列的打折广东河源第一富豪从草根逆袭为投资大佬,身价880亿广东河源首富出现从草根逆袭为投资大佬,身价880亿推荐语河源,广东省地级市,多年来先后荣获全国文明城市提名城市中国优秀旅游城市国家级生态保护与建设示范区等。除此之外,河源更是地如其福建蕉城第一富豪身价超过马云马化腾,打造新能源龙头企业福建蕉城第一富豪身价超过马云马化腾,打造新能源龙头企业推荐语福建蕉城区,地处福建省东北部的鹫峰山南麓三都澳之滨。蕉城依山傍海,风光秀丽,旅游资源独特,历史悠久,文化底蕴深厚,素有海雷州低调富豪打造广州商业地产龙头企业,坐拥百亿财富广东雷州低调富豪打造广州商业地产龙头企业,坐拥百亿财富推荐语雷州,广东省辖县级市,由湛江市代管。雷州历史悠久,远在四五千年以前的新石器时代便有人类繁衍生息,历来是雷州半岛的政治经济37岁和马云做生意,大赚277亿,何小鹏如今怎样了?37岁便和马云做生意,大赚277亿,湖北富豪何小鹏如今怎样了?推荐语众所周知,相对于湖南而言,湖北人相对低调,更喜欢闷声发大财。特别是自改革开放以来,湖北地区诞生的富豪真是数不胜数