`
jja1982
  • 浏览: 112465 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

C与Java ++区别(转载)

    博客分类:
  • J2SE
阅读更多
相信大家在学习编程的时候对i++和++i这两个表达式所组成的复合表达式都或多或少有些困惑吧,一些编程高手也未必能弄清此中奥妙,本人在CSAI网论坛上看到一组有关JAVA和C/C++中i=i++表达式的研究,发现有所得,现将所获公布于此,供大家琢磨研究:

i=i++的结果java 和 c/c++是不一样的

一、先谈后++:

1. java里, 在表达式运算中,++执行后的结果参加表达式运算。
如果不明白什么意思,看下面例子:

Example 1:
Line 1: i = 0;
Line 2: System.out.println(i++); //输出 0;
Line 3: System.out.println(i); //输出 1;

分析:i++值是0, 但是i++执行后i是1,所以Line 2输出是0,
Line 3输出是1.
至于赋值,java 是这样的, 如 i = i++; 因为从Line 2可以得知i++值是0,
所以 i = i++; 即 i = 0; 而C/C++却不是这样的.见C/C++中的说明

Example 2:
Line 4: i = 0;
Line 5: System.out.println(i++ + i++); // 0 + 1; 输出1
Line 6: System.out.println(i); // 2; 输出2

分析:Line 5中第一个i++值是0,但是i++ 执行后,i值是1;由于执行到
第二个i++的时候i的值是1,所以第二个i++的值是1,执行后i值是2.

Example 3:
Line 7: i = 0;
Line 8: System.out.println(i++ + i++ + i++); // 0 + 1 + 2; 输出3
Line 9: System.out.println(i); // 3; 输出3

分析:Line 8中第一个i++值是0,但是i++ 执行后,i值是1;由于执行到
第二个i++的时候i的值是1,所以第二个i++的值是1, 执行后i值是2; 由
于执行到第三个i++的时候i的值是2, 所以第二个i++的值是2, 执行后i
的值是3

依此类推.



2. 而在C/C++中,后++是在整个表达式运算结束以后进行的.

Example 4:
Line 10: i = 0;
Line 11: printf("%d\n", i++); //输出 0;
Line 12: printf("%d\n", i); //输出 1;

分析:i++值是0, 但是i++执行后i是1,所以Line 11输出是0,
Line 12输出是1.
上面已经说到后++是在整个表达式运算结束以后进行的.
所以i=i++中的++是在表达式运算结束后进行.

i = 0;
printf("%d\n", i=i++); //i++为0, i=i++ 这是一个表达式,它的值依然是0,输出 0;
printf("%d\n", i); //i=i++结束后,进行自加,输出 1;

Example 5:
Line 13: i = 0;
Line 14: printf("%d\n", i++ + i++); // 0 + 0; 输出0,
Line 15: printf("%d\n", i); // 2; 输出2,自增两次

分析:Line 14中i++ + i++是一个表达式,在执行过程中,i不自增加,
待整个表达式执行完毕后,i自增

Example 6:
Line 16: i = 0;
Line 17: printf("%d\n", i++ + i++ + i++); // 0 + 0 + 0; 输出0
Line 18: printf("%d\n", i); // 3; 输出3

分析:同上

二、再谈前++:
1. java里, 在表达式运算中,++先执行后,然后执行表达式运算。
如果不明白什么意思,还得看下面例子:

Example 7:
Line 19: i = 0;
Line 20: System.out.println(++i); //输出 1;
Line 21: System.out.println(i); //输出 1;

分析:++i值是1, ++i执行后i也是1,所以Line 20和Line 21输出结果相同,都是1

Example 8:
Line 22: i = 0;
Line 23: System.out.println(++i + ++i); // 1 + 2; 输出3
Line 24: System.out.println(i); // 2; 输出2

分析:Line 23中第一个++i值是1,++i 执行后,i值也是1;由于执行到
第二个++i的时候i的值是1,所以第二个++i的值是2,执行后i值是2

Example 9:
Line 25: i = 0;
Line 26: System.out.println(++i + ++i + ++i); // 1 + 2 + 3; 输出6
Line 27: System.out.println(i); // 3; 输出3

分析:同上

依此类推.

2. 在C/C++中,和java中一致,唯一的区别在于使用的寄存器不同,这也有可能导致
最终运算结果不同.可以看一下Example 11 和 Example 12

Example 10:
Line 28: i = 0;
Line 29: printf("%d\n", ++i); //输出 1;
Line 30: printf("%d\n", i); //输出 1;

分析:++i值是1,++i执行后i是1,所以Line 29和Line 30输出都是1

Example 11:
Line 31: i = 0;
Line 32: printf("%d\n", ++i + ++i); // 2 + 2; 输出4,
Line 33: printf("%d\n", i); // 2; 输出2,自增两次

分析:Line 32 的输出结果有可能大家都比较迷惑,为什么是2 + 2, 而不是1 + 2.
这里还得从它的汇编代码研究.
0040D728 mov dword ptr [ebp-4],0 // i = 0;
0040D72F mov eax,dword ptr [ebp-4]
0040D732 add eax,1 // 第一个 ++i;
0040D735 mov dword ptr [ebp-4],eax // i = 1;
0040D738 mov ecx,dword ptr [ebp-4] //
0040D73B add ecx,1 // 第二个 ++i;
0040D73E mov dword ptr [ebp-4],ecx // i = 2
0040D741 mov edx,dword ptr [ebp-4] // edx 是求和的值,可以看到并不是使用mov edx eax; add edx dword ptr [ebp-4]
0040D744 add edx,dword ptr [ebp-4] // 所以得到的是2+2, 而不是1+2
0040D747 push edx
其实继续加下去的话,可以清楚地了解其中的道理,在Example 12中加以说明

Example 12:
Line 34: i = 0;
Line 35: printf("%d\n", ++i + ++i + ++i + ++i); // 2 + 2 + 3 + 4; 输出11
Line 36: printf("%d\n", i); // 4; 输出4

分析: 还得看汇编代码:
0040D728 mov dword ptr [ebp-4],0 // i = 0;
0040D72F mov eax,dword ptr [ebp-4]
0040D732 add eax,1 // 第一个++i
0040D735 mov dword ptr [ebp-4],eax // i = 1;
0040D738 mov ecx,dword ptr [ebp-4]
0040D73B add ecx,1 // 第二个++i
0040D73E mov dword ptr [ebp-4],ecx // i = 2;
0040D741 mov edx,dword ptr [ebp-4] //注意这里!!!!!!!
0040D744 add edx,dword ptr [ebp-4] // 在Example 11中有说明,edx 是求和的值,和的值只用了这一个寄存器
//所以第一次 + 运算时就出现了 2 + 2情形, 此时edx即为4
0040D747 mov eax,dword ptr [ebp-4]
0040D74A add eax,1 //第三个 ++i
0040D74D mov dword ptr [ebp-4],eax // i = 3;
0040D750 add edx,dword ptr [ebp-4] // edx = edx + 3 = 4 + 3 = 7;
0040D753 mov ecx,dword ptr [ebp-4]
0040D756 add ecx,1 //第四个 ++i
0040D759 mov dword ptr [ebp-4],ecx // i = 4;
0040D75C add edx,dword ptr [ebp-4] // edx = edx + 4 = 7 + 4 = 11;
0040D75F push edx

结束运算,Line 35输出结果为11; Line 36 输出结果为i=4,

依此类推
分享到:
评论

相关推荐

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    有限状态自动机,JAVA实现

    转载有限状态自动机,JAVA实现,源码 *author dbhunter *Email dbhunter@126.com

    文本识别 java ocr

    文本识别 java ocr 转载

    Java并发编程的艺术

    并发编程领域的扛鼎之作,作者是阿里和1号店的资深Java技术专家,...作者:爱你多啦梦链接:https://www.jianshu.com/p/c17fd7817ddf来源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    JNI学习示例代码,含java代码工程和win32 dll工程

    通过JNI可以使得Java与C/C++机型交互。即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。...

    java面试试题集锦

    java面试试题集锦 java面试笔试题大汇总 及c-c++面试试题转载

    Thinking in Java(4th) 无水印pdf

    Thinking in Java(4th) 英文无水印pdf 第4版 pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者...

    家具购物系统,可用于期末作业或者毕设参考学习 系统定制请联系博主

    Browser指的是Web浏览器,与C/S架构相比,B/S模式极少数事务逻辑在前端实现,它的主要事务逻辑在服务器端实现。B/S架构的系统无须特别安装,只有Web浏览器即可。 ———————————————— 版权声明:本文为...

    JAVA基础知识精华总结 收藏

    JAVA基础知识精华总结 收藏 1、 对象的初始化 (1) 非静态对象的初始化 在创建对象时,对象所在类的所有数据成员会首先进行初始化。 基本类型:int型,初始化为0。 如果为对象:这些对象会按顺序初始化。 ※在...

    Java资源搜索网

    非常不错的如果程序运行之后报错 ,一般是由于JDK版本不同的原因,我使用的是JDK1.7,因为在JDK1.7中加入了Swicth(String)即可以对字符串进行切换, ...版权声明:本文为博主原创文章,转载请附上博文链接!

    两鼠穿墙问题的Java代码实现

    本Word文档向大家介绍了两鼠穿墙问题Java代码实现的相关内容。 原创;全程独立完成,没有查阅任何资料,全凭自身推算和测试得出结果;不得抄袭和转载。

    Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口

    好啊好啊 抽象类与接口是Java中最重要部分之一,这里用较大的篇幅来做下这部分的笔记. 1. final关键字 在Java中, 可以使用final关键字修饰类、方法以及成员变量。 (1).final标记的类不能被继承; (2).final标记...

    leetcode下载-java-eight-part:『Java八股文』Java面试套路,Java进阶学习,打破内卷拿大厂Offer,升职加薪

    Java并发编程(J.U.C) :thumbs_up: 疯狂更新中…… Java8实战 Java注解 :baby_chick: Redis 面试八股文 知识点详解 :tiger_face: 消息队列(kafka) :cow_face: 分布式 :ewe: 关系数据库 :frog: 五分钟入门系列 :horse_...

    bcprov加密库

    org.bouncycastle.openssl.PEMException: problem parsing ENCRYPTED PRIVATE KEY: java.lang.SecurityException: JCE cannot authenticate the provider BC at org.bouncycastle.openssl.PEMReader$...

    JAVA调用C语言写的SO文件

    因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 1 // 用JNI实现 2 // 实例: 3 4 // 创建HelloWorld.java 5 class HelloWorld...

    C` C++ `JAVA `C# `软件测试 各种面试题

    都是面试题``有转载的``这里也谢谢那些人了

Global site tag (gtag.js) - Google Analytics