public class Difficult { public static void main(String[] args) { int i=2;//这里初始i为2 i=i++; //这里执行i=i++后,i还是2,按照操作符优先级 = 号从左到右执行,这几句实际就是i=i,后面的++无效,如果这里改为i=++i,这样就会执行加1,按照从左到右就执行了++ int j=i++; //这一句i自身执行了++,所以j就为3了,这个时候j还没有变,这个就是++i和i++的区别 System.out.println(i+":"+j); //输出结果3:2 } }
i=3:j=2 i = i++; 是i被付两次值,第一次是i = 3想当于i++,第二次被付值i = 2
以前写WINDOWS里面的BAT脚本时也没有理解编译器的工作流程,想当然,写过类似这样一段set a=1 set b=%a% set a=2认为最后面b=2,实际上用运行这段BAT你会发现,句子变成了 set a=1 set b=1 set a=2 编译器编译过后,b的值根本和a无关了,这里也是一样i++返回的流程我们想当然的认为它和i有关,其实这句的返回值是个和i无关的返回栈值
可以说这是JAVA的一个陷阱,C#也一样的执行结果。 不过用C++就不同了 i = i++; //执行之后i会变成3
public class Test { public static void main(String[] args) { int i=2; i=i++; //这里要注意是把i++这个表达式的值赋给i,而i++的这个表达式的值是2,i是3,把表达式的值又赋给 i,那么i又变回2了 int j=i++; //这里不用解释了吧,J=3 System.out.println(i+":"+j); } } //i=i++;并不i++相同,如下代码 //public class Test { // public static void main(String[] args){ // int sum=0; // for(int i=0;i<100;i++){ // sum=sum++; // } // System.out.println(sum); // } //} //结果为0,如果把sum=sum++;改成sum++;就是100了
public class Test { public static void main(String[] args) { int i=2; i=i++; //这里要注意是把i++这个表达式的值赋给i,而i++的这个表达式的值是2,i是3,把表达式的值又 //赋给 i,那么i又变回2了 int j=i++; //这里不用解释了吧,J=3 System.out.println(i+":"+j); } } //i=i++;并不i++相同,如下代码 //public class Test { // public static void main(String[] args){ // int sum=0; // for(int i=0;i<100;i++){ // sum=sum++; // } // System.out.println(sum); // } //} //结果为0,如果把sum=sum++;改成sum++;就是100了
int temp = i ;
i++;
i = temp;
那个i=i++;的效果,应该和i++;相同才对。
i=i++可以看成是i=i+1,i=2,因为i++是首先将i的值取出,然后对i进行加1运算,将结果赋值给i。所以i=i++的运算过程如下:
1)取出i的值放入临时内存;
2)i自身加1赋值给i
3)从临时内存中取出第一步得到的值赋值给i也就是所,i被赋值了两次,而第二次覆盖掉了第一次的赋值,所以,该表达式没有意义。
{
int i=2;//这里初始i为2
i=i++; //这里执行i=i++后,i还是2,按照操作符优先级 = 号从左到右执行,这几句实际就是i=i,后面的++无效,如果这里改为i=++i,这样就会执行加1,按照从左到右就执行了++
int j=i++; //这一句i自身执行了++,所以j就为3了,这个时候j还没有变,这个就是++i和i++的区别
System.out.println(i+":"+j); //输出结果3:2
}
}
i = i++;
是i被付两次值,第一次是i = 3想当于i++,第二次被付值i = 2
1)i++;i=i
2)temp=i;i++;i=temp
但在java中是明确规定使用后一种方式
P.S GOOGLE到的
i=i++;因为++的优先级比=高,这个语句要先执行i++,,这时i的值为3,再执行i=i++,i++这个表示式的值是做++之前的i的值,是2,把2赋值给了i,i又变成2.j=i++;执行顺序同上。所以打印出来的是:3,2
for(int i = 0; i<1000 ; i++)
{
j=j++;
}
System.out.println(j);先前见的相同的题
我们想象中把它拆分成i=i;i=i+1;逐段编译执行。实际上这一句是整体编译起汇编再组合就可能是另外一种流程。i++的汇编中的流程是将i值暂存在栈中,然后将i+1返回引用i,然后弹出栈值。计算机底层的流程也是汇编的这个流程,这样一看显尔易见,i=i++并不是我们想象中的i=i;i=i+1的两句组合了,在计算机底层i不一定就指向i的同一块存储空间,在计算机底层根本没有i,只有放i值的寄存器。
i=i++是先给i赋值,然后在加1,而且不会影响i的赋值
set b=%a%
set a=2认为最后面b=2,实际上用运行这段BAT你会发现,句子变成了
set a=1
set b=1
set a=2
编译器编译过后,b的值根本和a无关了,这里也是一样i++返回的流程我们想当然的认为它和i有关,其实这句的返回值是个和i无关的返回栈值
但i=i++ 等同 不写
这句int j=i++; //这一句i自身执行了++,所以j就为3了,这个时候j还没有变,这个就是++i和i++的区别
看到貌似在书写上有问题
应该是j被i赋值为2,i变成了3。
i = i++; //执行完后i=2
j = i++; //执行完后j=2 i=3 (i++在分号过后才执行自加)
不过用C++就不同了
i = i++; //执行之后i会变成3
int i=2;
i=i++; //这里要注意是把i++这个表达式的值赋给i,而i++的这个表达式的值是2,i是3,把表达式的值又赋给 i,那么i又变回2了
int j=i++; //这里不用解释了吧,J=3
System.out.println(i+":"+j);
}
}
//i=i++;并不i++相同,如下代码
//public class Test {
// public static void main(String[] args){
// int sum=0;
// for(int i=0;i<100;i++){
// sum=sum++;
// }
// System.out.println(sum);
// }
//}
//结果为0,如果把sum=sum++;改成sum++;就是100了
int i=2;
i=i++; //这里要注意是把i++这个表达式的值赋给i,而i++的这个表达式的值是2,i是3,把表达式的值又
//赋给 i,那么i又变回2了
int j=i++; //这里不用解释了吧,J=3
System.out.println(i+":"+j);
}
}
//i=i++;并不i++相同,如下代码
//public class Test {
// public static void main(String[] args){
// int sum=0;
// for(int i=0;i<100;i++){
// sum=sum++;
// }
// System.out.println(sum);
// }
//}
//结果为0,如果把sum=sum++;改成sum++;就是100了