社区
Java
帖子详情
一个简单奇怪的问题,百思不得其解!
Northwindrocker
2003-08-27 09:27:39
int i = 0;
i = i++;
System.out.println(i);
告诉我结果!嘿嘿
0
谁能解释WHY?
...全文
58
21
打赏
收藏
一个简单奇怪的问题,百思不得其解!
int i = 0; i = i++; System.out.println(i); 告诉我结果!嘿嘿 0 谁能解释WHY?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
21 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
longaway
2003-09-28
打赏
举报
回复
拜托,居然有那么多专家。i 服了。
不管怎么说,这就是 java 。
i = i ++;
i = i --;
i 得值都不会变的。
之所以作为一道题目出现,就是告诉你这个事实。
真有兴趣,哪位看看字节码是怎么实现的。(我瞎猜得。)
另:
java 和 c++ 的结果确实不一样。
但是,java是有严格定义的,所有符合规范的虚拟机或者编译器都是这个结果。
c++ 就不知道是不是了。
admiralsf
2003-09-25
打赏
举报
回复
如果i=2+2*(i++);\\2
是temp=i;
i=i+1;
i=2+2*(temp);
i=2+2*(i++)+2*(i++);\\4
是temp=i;
i=i+1;\\i=1
temp=i;
i=i+1;\\i=2
i=2+2*(temp)+2*(temp);\\i=6
请问高人应怎么解释
Kinli
2003-09-25
打赏
举报
回复
to moke33(moke): 你说有对, 在C++里结果的确是1. 但不在于编译的问题, 而是机制的问题
当运行i=i++; 时, i赋了0之后, 就会被保存在寄存器, 再执行i++;
println(i);时候的i, 是寄存器里的i. 所以是0
diaopeng
2003-09-24
打赏
举报
回复
狂晕~~~~楼主在考人呀??这么简单的问题都问?
alexlex
2003-09-23
打赏
举报
回复
i = 0;
i = i++;
相当于: tmp = i; i = i + 1; i = tmp;
执行后:i = 0
这个解释最清楚,同意zhirenshao(我属老鼠)的话,自增符合的副作用大家都知道
楼主的疑惑在于i自增之后在对自己赋值的顺序问题吧,这点就像moke33(moke) 说得,
用dev c++ 执行顺序应该是 tmp = i; i = tmp; i = i + 1 先赋值再自增 结果i=1
java 执行顺序应该是 tmp = i; i = i + 1; i = temp 先自增再赋值 由于赋值取的是临时变量temp 结果i=0
fq603fq
2003-09-23
打赏
举报
回复
zhirenshao(我属老鼠) ,呵呵~我只是明显地指出了副作用符~希望对楼主有用~我觉得这正是他要问的
fq603fq
2003-09-22
打赏
举报
回复
楼上的很多人都没有说清楚它的本质啊,希望我说的有用
这个跟c++里面一样
i++和++i都是一个整体运算,前者的值等于i,后者的值等于i+1;
而++是具有副作用的运算符,无论在前面还是在后面都将改变i的值
zhirenshao
2003-09-22
打赏
举报
回复
回楼上,谁说楼上都没有说出问题本质,我看是你没有弄清楼主的疑惑
jkit(郁闷之堕落的程序员 和 csdnxw(大家帮忙) 就回答得很好嘛。 他解释了在机器内部 i = i++; 这个操作是如何完成的。
请看以上二人的回复
csdnxw
2003-09-19
打赏
举报
回复
jkit说的已经很明白了,要从类的观点看待这些问题。
to admirals,这不是编译器的bug,是逻辑错误。
i = 0;
i=2+(i++);//i=2;
1 取出i的值 temp = i // temp = i = 0
2 i自加 // temp = 0 , i = 1
3 i = 2 + temp // i = 2 + 0 = 2
何错只有?
ratjohn
2003-09-19
打赏
举报
回复
胡说!i++是先运算,再加一,所以值为0
admiralsf
2003-09-16
打赏
举报
回复
试过i=(i++);//i=0
i=2+(i++);//i=2;
i=2+(i++)+(i++);//i=3
i=2+2*(i++)+2*(i++);//i=4
i=2+2*(++i)+2*(++i);//i=8
i=2+2*(++i)+2*(i++);//i=6
充分说明第次出现的i++没执行,这一定是编译器的bug。
admiralsf
2003-09-16
打赏
举报
回复
虽然解释的通但是没有道理
peter207
2003-09-08
打赏
举报
回复
to lsy110(毛毛)
不管怎么样,i++的操作总应该在print之前执行吧
我觉得jvm的机制跟c,c++的不一样,
moke33(moke) 已经测试过c++的结果是1了
ttaomeng
2003-09-08
打赏
举报
回复
对的对的,都是一样
isquare
2003-09-08
打赏
举报
回复
上面JKIT说的很明白了,你可以在机子上试试
moke33
2003-08-27
打赏
举报
回复
这个和具体的编译器应该有一定关系吧,我在Dev-c++中测试的结果是1
jdk1.4 是0
关于++和--,在c++和java中不是一样的吗?
怎么会有这种结果?
lsy110
2003-08-27
打赏
举报
回复
噢!對不起,上面我的帖子講錯了,其實:
-------------------------------------------------
int i = 0;
i = i++; --〉如果是i++,那么此次操作后,i=1,那么println(i)等于1;由于你是i=i++,那
么當前操作i=0賦值給i!所以就有值等于0咯!
System.out.println(i);
learnner
2003-08-27
打赏
举报
回复
to geyf(其实我也不会)
'先赋值后++'是对的,但是为什么++发生在println之后呢
jkit
2003-08-27
打赏
举报
回复
x = 0
y = x++;
相当于: tmp = x; x = x + 1; y = tmp;
执行后:y = 0
i = 0;
i = i++;
相当于: tmp = i; i = i + 1; i = tmp;
执行后:i = 0
比较一下就知道了,其实很简单。
geyf
2003-08-27
打赏
举报
回复
如果是:
j=i++;
你能理解吧,先赋值后++,
加载更多回复(1)
一个
百思不得其解
的Linux黑屏
问题
在本次视频分享中,我遇到了
一个
奇怪
的Linux系统配置
问题
。一位使用Ubuntu 20.04操作系统的神州笔记本用户遇到三大故障:显示器无法扩展至第二屏、无线WiFi功能缺失以及蓝牙不可用。设置使用 Nvidia 独立显卡后,不论是使用旧内核、还原设置还是卸载 Nvidia 驱动均黑屏。最后通过编译安装6.7内核解决。首发地址:学习日记 https://www.learndiary.com/2024/02/strange-black-screen/
PL/SQL传参中
一个
很
奇怪
的
一个
问题
刚用PL/SQL, 今天碰到
一个
很
奇怪
的
问题
,实在
百思不得其解
。 不知道什么原因引起的。
问题
如下: ---------------------------------------------------------------------------- 1) 我在shell脚本中使用sqlplus 调用SQL文件, 向这个SQL文件传递了
一个
参数 ===== File : mysh
一个
奇怪
的
问题
一个
奇怪
的Crash【Segment Fault】
问题
今天在运行程序时,遇到
一个
问题
,偶尔程序会出
问题
,而且出
问题
时,结构体里的指针都是很
奇怪
的地址,而且整形变量也是
奇怪
的负值,如下: (gdb) p value $1 = {lval = -8070450165744038711, dval = -1.2883345903292424e-231, counted = 0x9000005555558cc9, str = 0x9000005555558...
奇怪
的字符串
ISIJ 2018
奇怪
的字符串(Training Round D6T1) 无忧公主 2018-07-10 题目描述 考虑字符串 s 仅由小写字母组成,例如 “abba”。定义 W(s) 为 s 所有本质不同的连续子串的集合,例如 W(“abba”) = { “a”,”b”,”ab”,”ba”,”bb”,”abb”,”bba”,”abba” }。定义 Y(s) 为 s 所有本质不同的非连续子...
Java
51,408
社区成员
86,095
社区内容
发帖
与我相关
我的任务
Java
Java相关技术讨论
复制链接
扫一扫
分享
社区描述
Java相关技术讨论
java
spring boot
spring cloud
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章