i = i++的问题 int i = 1; i = i++; System.out.println(i);输入为什么是1 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 怎么又是这问题?i=i++;先执行++运算符,i的值的2.求(i++)这个表达式的值,是执行++之前i的值1.再赋值.这样的表达有什么意义吗?包含i++,i--,++i,--i之一的表达中就不要再出现另一个i了,完全没有必要找麻烦。 楼主可以打印一下System.out.println(i++); 结果是1吧那当然你再赋值给i,i就是1啦 告诉楼主一个简单的方法 以后就不犯错了int i = 1; int j; j = i++; System.out.println(j); i++ i=2 返回值1i=i++的返回值 你们看清楚,我问的是i=i++不是什么 j=i++还有我问的 为什么为什么为什么为什么打印出来的是 1!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~而不是2 那么i=i++ 这一行的 两个i 与前边的变量定义有什么关系 i=i++;//先赋值后++i=++i;//先++后赋值 应该从操作符优先级作分析++优先于=i=1;i = (i++);i++返回的结果是1 i++把i的值改成了2 之后把i++返回的结果1赋值给i 所以 i=1; i++ 先引用再赋值;++i 先赋值再引用. int i = 1; i = i++; System.out.println(i); //这个地方先引用i的值,输出自然是1了,如果是 ++i,才输出2 看我5楼的代码了没 那个i=i++ 左边的i你可以换成别的变量 这样你就不会被蒙蔽了 哎 我对你无语了 帮你理解 你还i=1, i++ =1 然后把1赋值给j 打印出来 还是1 你要管中间那么多干啥???还废话??? 哦,我来帮助楼主理解下8,我有些明白了i=i++步骤如下:1.先做(i++),先取出引用为1,然后进行自增运算i=2;2.然后i=i,因为使用先前的引用,所以把2又变回了1;3.打印出来了1不知道这种理解是否正确?? 其实说白了 就是运算符的优先级 我和lovecj6185只是把中间过程省略了 没想到遭到lz的白眼... 不是我要管那么多你们想想,学了这么久计算机,都学了什么,哪本书不是带你深入的剖析里面的原理?当然有一点,一门语言,不管是JAVA C++还是 C#的那个语法规范还是什么东西,JAVA的有600多页,这东西咱们看不到也学不到,我没事就喜欢研究一些个小的,但是看起来有意思的东西说错话的地方,请多谅解 楼主你也先好好看看楼上朋友们的回帖,看看别人说的是否有道理那楼上有几位也是有星的,在java版也是有一定权威的怎莫就你一个人研究原理,难道说大家都不懂?其实偶还在担心另一个问题如果偶的项目组里有楼主这样的,该如何是好呵呵 我也同意应该打印的是 2i=i++就我所学和理解相当于 i=i;i++;System.out.println(i);出来的自然是2 首先看运算符优先级,i++ 先做 , i自增值为2接着看表达式的返回值,i++这个表达式的运算结果是i之前的值1最后轮到等号运算符, i = (i++表达式的值) 这是java的bug,其实结果应该是2,贴一下汇编代码 int i = 1;0041183E mov dword ptr [i],1 // 给 i 赋值, i 为 1 i = i++; // 分解为 i = i; i++;00411845 mov eax,dword ptr [i] // 把 i 的值放到 寄存器 eax 中,eax 为 1, i = i 第 1 步00411848 mov dword ptr [i],eax // 把 寄存器 eax 中的值赋值给 i, i 为 1, i = i 第 2 步0041184B mov ecx,dword ptr [i] // 把 i 的值放到 寄存器 eax 中,eax 为 1, i++ 第 1 步0041184E add ecx,1 // 把 寄存器 eax 中的值加上 1, eax 为 2, i++ 第 2 步00411851 mov dword ptr [i],ecx // 把 寄存器 eax 中的值赋值给 i,i 为 2, i++ 第 3 步LZ死心了吧? 找到正解了,是处理机制不同,遇到这种有歧义的语句还是绕道吧……http://java.chinaitlab.com/base/21363.html http://blog.csdn.net/ZangXT/archive/2008/11/05/3229281.aspx 如果是这样,明明就是VC++的Bug.同一个值赋给不同的变量结果要不同才正确??? 就算赋值给其他变量 i还是等于 2j = i++;同样是分解成 j = i; 和 i++; 其实很多人都错误的理解楼主的意思了。我同意用汇编来解释,但很烦。 其实可以这样看的:i(1)=i(2)++; 我先它们编了个号;当(2)号i自加前会把1付给(1)号i;然后即会马上执行打印为“1”;其实还没来得及i自加变成2呢。其实这涉及到线程的问题。 请教war怎么调用类和配置文件 怎样实现java中的图形叠加? 新手求助 设计一个类,实现对长整型数据的分割 请问Iterator为什么没有排序呢? 小弟请问:public String intern()这个函数怎么用,或者帮忙翻译一下!谢谢了,高手帮忙! 拜托高手指点,写好的application应该用什么封装?? 大家看看这是哪种编码方式得到的字符串啊 一个简单的引用的问题 在线等待 怎么生成jar文件?? 一定给分!! 问一个简单问题,回答上来给分 Java swing学习者们一起探索,
求(i++)这个表达式的值,是执行++之前i的值1.
再赋值.这样的表达有什么意义吗?包含i++,i--,++i,--i之一的表达中就不要再出现另一个i了,完全没有必要找麻烦。
System.out.println(i++); 结果是1吧那当然你再赋值给i,i就是1啦
int j; j = i++; System.out.println(j);
i=i++的返回值
那么i=i++ 这一行的 两个i 与前边的变量定义有什么关系
i=++i;//先++后赋值
++优先于=i=1;
i = (i++);
i++返回的结果是1 i++把i的值改成了2 之后把i++返回的结果1赋值给i
所以 i=1;
++i 先赋值再引用. int i = 1; i = i++; System.out.println(i); //这个地方先引用i的值,输出自然是1了,如果是 ++i,才输出2
i=i++步骤如下:
1.先做(i++),先取出引用为1,然后进行自增运算i=2;
2.然后i=i,因为使用先前的引用,所以把2又变回了1;
3.打印出来了1
不知道这种理解是否正确??
不是我要管那么多
你们想想,学了这么久计算机,都学了什么,哪本书不是带你深入的剖析里面的原理?
当然有一点,一门语言,不管是JAVA C++还是 C#的那个语法规范还是什么东西,JAVA的有600多页,这东西咱们看不到也学不到,我没事就喜欢研究一些个小的,但是看起来有意思的东西说错话的地方,请多谅解
那楼上有几位也是有星的,在java版也是有一定权威的怎莫就你一个人研究原理,难道说大家都不懂?其实偶还在担心另一个问题
如果偶的项目组里有楼主这样的,该如何是好
呵呵
i=i++就我所学和理解
相当于 i=i;
i++;
System.out.println(i);出来的自然是2
0041183E mov dword ptr [i],1 // 给 i 赋值, i 为 1
i = i++; // 分解为 i = i; i++;
00411845 mov eax,dword ptr [i] // 把 i 的值放到 寄存器 eax 中,eax 为 1, i = i 第 1 步
00411848 mov dword ptr [i],eax // 把 寄存器 eax 中的值赋值给 i, i 为 1, i = i 第 2 步
0041184B mov ecx,dword ptr [i] // 把 i 的值放到 寄存器 eax 中,eax 为 1, i++ 第 1 步
0041184E add ecx,1 // 把 寄存器 eax 中的值加上 1, eax 为 2, i++ 第 2 步
00411851 mov dword ptr [i],ecx // 把 寄存器 eax 中的值赋值给 i,i 为 2, i++ 第 3 步
LZ死心了吧?
http://java.chinaitlab.com/base/21363.html
同一个值赋给不同的变量结果要不同才正确???
就算赋值给其他变量 i还是等于 2j = i++;
同样是分解成 j = i; 和 i++;
我同意用汇编来解释,但很烦。
其实可以这样看的:
i(1)=i(2)++;
我先它们编了个号;
当(2)号i自加前会把1付给(1)号i;
然后即会马上执行打印为“1”;
其实还没来得及i自加变成2呢。其实这涉及到线程的问题。