Java i++与++i困惑

thinkpadshi 2013-03-18 07:44:29
以下的两段代码为什么分析的过程不一致?也就是说,为什么i = i++ 这一段跟我们平时所说的++用法不一样呢?网上对于这道题都是用反编译去解释的,真心看着头晕,请高手通俗的解释一下


int i = 0;
int j = 0;
j = i++;
System.out.println(j);




int i = 0;
int j = 0;
i = i++;//这里是不同点
System.out.println(i);
...全文
852 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
坚持2012 2013-03-22
  • 打赏
  • 举报
回复
引用 23 楼 caochuankui 的回复:
{ int i = 0; int j = 0; j = i++;//赋给j的是i++的值为0;语句执行后i的值变为1 System.out.println(j); //输出1 } { int i = 0; int j = 0; i = i++;//赋给i的是i++的值为1;语句执行后i的值变……
搞错了: 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 | TOP caochuankui 坚持2012 等级: 结帖率:100% #23 得分:0 回复于: 2013-03-22 17:25:31 { int i = 0; int j = 0; j = i++;//赋给j的是i++的值为0;语句执行后i的值变为1 System.out.println(j); //输出1 } { int i = 0; int j = 0; i = i++;//赋给i的是i++的值为0;语句执行后i的值变为1 System.out.println(i); //输出1 }
坚持2012 2013-03-22
  • 打赏
  • 举报
回复
{ int i = 0; int j = 0; j = i++;//赋给j的是i++的值为0;语句执行后i的值变为1 System.out.println(j); //输出1 } { int i = 0; int j = 0; i = i++;//赋给i的是i++的值为1;语句执行后i的值变为2 System.out.println(i); //输出2 }
jswatcher 2013-03-20
  • 打赏
  • 举报
回复
引用 14 楼 jswatcher 的回复:
根据 JavaScript Language Specification 的定义, …… 表达式 A=B 的执行步骤,简单地说,就是: …… 表达式 A++ 的执行步骤 ……
---------------------- 补充一下,参考连接: 参照的是 Java Language Specification, 7 Edition (Java语言规范,google 了一下,specification 翻成“规范”,对吧? 直接读的英文,许多词不知怎么译) 关于“表达式 A=B”,参照连接:15.26.1. Simple Assignment Operator = 关于“表达式 A++”,参照连接:15.14.2. Postfix Increment Operator ++
jswatcher 2013-03-20
  • 打赏
  • 举报
回复
引用 18 楼 thinkpadshi 的回复:
…… 哈哈,好高深,不过也有些道理
不高深,只是有些绕嘴难懂,因为是 Specification。 不只是“有些道理”,而是就是这么规定的,必须如此! 根据 Java Language Specification (Java 语言规格,抱歉,不知中文IT词的翻译是否正确。) 如果一个 Java VM 不按照这个规定运行,那它就是错误的。
浪荡天涯行 2013-03-20
  • 打赏
  • 举报
回复
引用 12 楼 shujia_zaibeijing 的回复:
int i = 0; int j = 0; j = i++; System.out.println(j); i++相当于i=i++;所以j=i++,就是先把i的值赋给j,然后i再加1,所以上题j的值是0,i的值是1 int i = 0; int j = 0; i = i++; Syste……
这已经说明的很清楚了。
薛123 2013-03-20
  • 打赏
  • 举报
回复
thinkpadshi 2013-03-20
  • 打赏
  • 举报
回复
引用 14 楼 jswatcher 的回复:
根据 JavaScript Language Specification 的定义, 表达式 A=B 的执行步骤,简单地说,就是: 1. 对等号左边的表达式 A 进行计算,算出最终的结果,必须是参照或变量; 2. 对等号右边的表达式 B 进行计算,得到返回值; 3. 把第2步得到的右边的返回值,赋予第一步中得到的左边的参照或变量。 表达式 A++ 的执行步骤是,简单地说,就是……
哈哈,好高深,不过也有些道理
thinkpadshi 2013-03-20
  • 打赏
  • 举报
回复
引用 13 楼 php17 的回复:
其实可以这样理解i=i++ 等同于 temp=i; i++; i=temp; 所以i不变~~
哈哈,这个够通俗,也正确,多谢了
thinkpadshi 2013-03-20
  • 打赏
  • 举报
回复
引用 12 楼 shujia_zaibeijing 的回复:
int i = 0; int j = 0; j = i++; System.out.println(j); i++相当于i=i++;所以j=i++,就是先把i的值赋给j,然后i再加1,所以上题j的值是0,i的值是1 int i = 0; int j = 0; i = i++; System.out.println……
哈哈,你跟我刚看到这道题的时候理解是一样的,可惜Java中执行结果不是1,在i = i++中,i最后是不变的
奔跑的女孩 2013-03-19
  • 打赏
  • 举报
回复
那输出结果是多少呢?
黑石课堂 2013-03-19
  • 打赏
  • 举报
回复
jswatcher 2013-03-19
  • 打赏
  • 举报
回复
根据 JavaScript Language Specification 的定义, 表达式 A=B 的执行步骤,简单地说,就是: 1. 对等号左边的表达式 A 进行计算,算出最终的结果,必须是参照或变量; 2. 对等号右边的表达式 B 进行计算,得到返回值; 3. 把第2步得到的右边的返回值,赋予第一步中得到的左边的参照或变量。 表达式 A++ 的执行步骤是,简单地说,就是: 1. 对 A 进行计算,算出最终的结果,必须是参照或变量; 2. 第一步中得到的参照或变量的值 加一; 3. 整个表达式的返回值是 第二步加一之前,第一步中得到的参照或变量的值。 i=0; i=i++; 执行步骤如下: 1. 计算等号左边,不用算,结果就是就是变量 i; 2. 对等号右边的表达式 i++ 进行计算; 2.1. i 是变量,本身不用算; 2.2. i++ 的计算时,i 的值被加 1; 2.3. 整个 i++ 表达式的计算结果的 返回值是,i被加一之前的值 0。 3. 把第一步中算出的右边的结果 0, 赋予左边的变量 i. 结果 i 的值是 0
php17 2013-03-19
  • 打赏
  • 举报
回复
其实可以这样理解i=i++
等同于
temp=i;
i++;
i=temp;
所以i不变~~
shujia_zaibeijing 2013-03-19
  • 打赏
  • 举报
回复
int i = 0; int j = 0; j = i++; System.out.println(j); i++相当于i=i++;所以j=i++,就是先把i的值赋给j,然后i再加1,所以上题j的值是0,i的值是1 int i = 0; int j = 0; i = i++; System.out.println(j); i++相当于i=i++;所以i=i++,就是先把i的值赋给等号左边的那个i,然后i再加1,所以等号做边的值是1看的时候可以把他们看成不同的变量
lwpbobo 2013-03-19
  • 打赏
  • 举报
回复
++在后 先=赋值在++ i=i++ 一般也不会这么写 要么就直接i++;了
biany2 2013-03-19
  • 打赏
  • 举报
回复
i = i++;//这里是不同点 很显然,正常情况下是i++ 很显然,没有实际意义,i还是等于i+1
thinkpadshi 2013-03-18
  • 打赏
  • 举报
回复
引用 3 楼 afu1972715000 的回复:
算术运算符: + - * /(商) %(取模) ++ -- ++ int i =10; i++;===>i=11; ++i;===>i=12; i++/++i===>赋值给其他同类型的变量 int m =i++; int n =++i; ++在右边时,先赋值再计算 ++在左边时,先计算再赋值 --
这个我当然知道,就是因为我知道这个原理,所以才碰到了困扰,按照这个原理的话,我提的问题里肯定有一题会做错的,所以我才来提问的
thinkpadshi 2013-03-18
  • 打赏
  • 举报
回复
引用 2 楼 gzkentkwan 的回复:
问一下楼主 =和++运算符 哪个优先级高
这个不是优先级的问题吧
thinkpadshi 2013-03-18
  • 打赏
  • 举报
回复
引用 1 楼 ticmy 的回复:
http://www.ticmy.com/?p=43
哈哈,这个我也看到了,只是栈里的这部分看不懂,太麻烦了,就是想要一种通俗的解释,貌似只有你看懂了我的意图,其他人回答的都不在点子上
zqfddqr 2013-03-18
  • 打赏
  • 举报
回复
i=i++;这句是要表达什么呢 以前在论坛见到一句话奇异代码要少写。
加载更多回复(4)

51,396

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧