社区
Java
帖子详情
一个简单奇怪的问题,百思不得其解!
Northwindrocker
2003-08-27 09:27:39
int i = 0;
i = i++;
System.out.println(i);
告诉我结果!嘿嘿
0
谁能解释WHY?
...全文
56
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黑屏
问题
本文讲述了作者帮助一位用户解决Ubuntu20.04系统中Linux黑屏
问题
的过程,涉及内核升级、驱动管理,以及通过修改启动参数和固件安装来恢复无线WiFi、蓝牙和双屏扩展功能。
PL/SQL传参中
一个
很
奇怪
的
一个
问题
本文探讨了在使用PL/SQL时遇到的
一个
奇怪
问题
,即参数在调用SQL文件过程中导致文件名生成出现歧义。通过分析SQL文件结构和参数传递方式,解释了
问题
原因,并提供了解决方案。
一个
奇怪
的
问题
作者分享了两个相似的程序段,
一个
可以正常运行,另
一个
出现错误的情况。通过排版过程中发现,错误源于
简单
的变量赋值错误。提醒开发者注意细节的重要性。
一个
奇怪
的Crash【Segment Fault】
问题
本文深入探讨了在程序运行中遇到的
奇怪
内存地址和负数整型变量
问题
,通过对比正常与异常情况下的内存地址,推测可能由于未初始化的栈上内容被复制导致。并提供了
一个
简单
的测试程序来验证这一假设,强调了变量初始化的重要性。
奇怪
的字符串
这篇博客讨论了ISIJ 2018比赛中关于
奇怪
字符串的
问题
,其中
奇怪
字符串满足其连续子串集合等于非连续子串集合。文章介绍了如何判断
一个
字符串是否
奇怪
,并提供了处理这类
问题
的思路,包括使用压缩扫描线和避免重复计数的方法。
Java
51,408
社区成员
86,092
社区内容
发帖
与我相关
我的任务
Java
Java相关技术讨论
复制链接
扫一扫
分享
社区描述
Java相关技术讨论
java
spring boot
spring cloud
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章