i++与赋值操作问题 result is 1,not zero.if i=i++; the result is 0;because the operation direction is from left to right. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 i=0i=i++ i=0i=0i=++ii=1 服了你了!下回弄明白了再问嘛!同意楼上的兄弟:i=i++是先赋值再加1,i=++i是先加1后赋值。 i++先使用i再将i加一++i相反 比如这样一个class:public class test { public static void main(String[] args) { int a = 5; a = a++; System.out.println(a); }}用javap来看看(编译后javap -c test):(略去前面一些与此关系不大的部分) 0 iconst_5 // 常数5压入堆栈中 1 istore_1 // 从堆栈中弹出赋值给索引为1的变量(这个时候a=5) 2 iload_1 // *将后面那个a(索引为1的变量)的值压入堆栈中(为了以后的赋值) 3 iinc 1 1 // 执行a++, 此时堆栈无任何变化!(这个时候a=6) 6 istore_1 // 从堆栈中弹出赋值给a(这个时候a变成了5) // 下面就不用看了, 呵呵 ... 7 getstatic #2 <Field java.io.PrintStream out> 10 iload_1 11 invokevirtual #3 <Method void println(int)> 14 return值得注意的是上面打星号的那一行, 我想我还得举个例子来说明:事实上, a = a++中, 赋值给a永远都是最后一步, 而并非想象的a=a, 然后再a++ ... 为了描述上的方便, 做一下替换, 变成a=i++, 执行的过程如下:先把i压入堆栈中, 然后i++(i的值增加了1), 接着把i从堆栈中弹出赋给了a ...把这里的i换成a=a++中后面的那个a, 再结合上面javap提供的信息来看就应该能明白是怎么回事了, 呵呵 ...Good luck :) 真正的过程是这样的分为两部分evaluate 从左到右 i evalute 为0 然后 i++ evaluate 为0assignment从右往左 i= (i++ evaluate 出来的值 也就是 0) 肯定呀!!i=i++表示将i的初始值赋0给i后,i自身再加1,所以print出来的是0而不是1,如果下次使用i这个变量时,它的值才会是1。 這樣肯定是0;因為i++是0所以i = i++後i是0 在Java 中表达式的运算次序在语言规范里已经定义好了,所有平台上的JVM都应该是一样的,不存在二义性。但是在C/C++中,由于ANSI C并没有规定必须遵守的运算次序,因此这个运算的结果要取决于编译器的具体实现了。 很急,给80分 smslib发短信的问题 诡异的错误!! 一个java程序中如果有多个线程同时调用同一个个数据库会出现什么情况? 如何模拟早期版本的jdk来编译java文件呢? 关于classLoader getResourceAsStream的一个问题 急需解决 为什么 在 Linux 下, 不支持全屏? 能不能通过JAVA,来运行局域网内其他主机上的程序? 如何将bmp转化为wbmp呀 小问题,在线给分 请问怎样用jb来把java程序,编译成exe阿??求救!! 这段代码错在哪里?
i=i++
i=0i=0
i=++i
i=1
++i相反
public class test {
public static void main(String[] args) {
int a = 5;
a = a++;
System.out.println(a);
}
}用javap来看看(编译后javap -c test):
(略去前面一些与此关系不大的部分)
0 iconst_5 // 常数5压入堆栈中
1 istore_1 // 从堆栈中弹出赋值给索引为1的变量(这个时候a=5)
2 iload_1 // *将后面那个a(索引为1的变量)的值压入堆栈中(为了以后的赋值)
3 iinc 1 1 // 执行a++, 此时堆栈无任何变化!(这个时候a=6)
6 istore_1 // 从堆栈中弹出赋值给a(这个时候a变成了5) // 下面就不用看了, 呵呵 ...
7 getstatic #2 <Field java.io.PrintStream out>
10 iload_1
11 invokevirtual #3 <Method void println(int)>
14 return值得注意的是上面打星号的那一行, 我想我还得举个例子来说明:
事实上, a = a++中, 赋值给a永远都是最后一步, 而并非想象的a=a, 然后再a++ ... 为了描述上的方便, 做一下替换, 变成a=i++, 执行的过程如下:
先把i压入堆栈中, 然后i++(i的值增加了1), 接着把i从堆栈中弹出赋给了a ...
把这里的i换成a=a++中后面的那个a, 再结合上面javap提供的信息来看就应该能明白是怎么回事了, 呵呵 ...Good luck :)
分为两部分
evaluate 从左到右 i evalute 为0 然后 i++ evaluate 为0
assignment从右往左 i= (i++ evaluate 出来的值 也就是 0)
因為i++是0
所以i = i++後
i是0
但是在C/C++中,由于ANSI C并没有规定必须遵守的运算次序,因此这个运算的结果要取决于编译器的具体实现了。