i + (i++))与(i++) + i int i = 2;System.out.println(i + (i++));//输出为4int i = 2;System.out.println((i++) + i);//输出为5虽然不建议这么写代码,但是真有这种情况的,为什么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看看JVM指令就知道了 L0 LINENUMBER 9 L0 ICONST_2 ISTORE 0 L1 LINENUMBER 10 L1 GETSTATIC java/lang/System.out : Ljava/io/PrintStream; ILOAD 0 //从index为0的地方载入i ILOAD 0 //同上 IINC 0 1 //自增index为0的地方1 IADD // 这里和index 0一点儿关系都没有了,结果当然是4 INVOKEVIRTUAL java/io/PrintStream.println(I)V 再看看第二个: L0 LINENUMBER 14 L0 ICONST_2 ISTORE 0 L1 LINENUMBER 15 L1 GETSTATIC java/lang/System.out : Ljava/io/PrintStream; ILOAD 0 //从index为0的地方载入i i=2 IINC 0 1 //自增index为0的单元,这时候i=3了 ILOAD 0 //从index为0的地方载入i,i=3 IADD // 2+3=5 INVOKEVIRTUAL java/io/PrintStream.println(I)V i++说是先将i的值作为表达式(i++)的值,再将i进行++,那么实现这一个操作,方法就不同了。第一种方法,先将i作为(i++)这个表达式的值,然后与其他操作数进行运算,整个表达式都算完后,再进行i++操作。VC6.0编译出来的程序,就是这么做的。而且用这种方法计算的话,你的表达式当然都会是4.而Java使用的方法,只能说明,它先将i作为表达式i++的值,与左边的操作符结合进行运算等到一个值c,运算完后就进行i++操作,然后再将c与右边的操作符结合进行运算,那么这时候,右边的表达式中有i,这个i自然是已经修改过后的了。 这涉及到自增问题如果用于自增,++i和i++是一样的效果。不过,如果用于赋值的话,++i是先加1再赋值,i++是先赋值后加1。 挺有意思的问题。不过看结果应该知道是Java编译器是如何处理的了。 我觉得+号是右结合性的,所以因从左往右计算,第一题:第一个i为先计算取值为2,第二个i++因为是后加,所以取到的值是2,所以第一题计算结果为4;第二题:第一个i++取到的值是2,第二个i是在第一个i执行++后才取值的,所以i的值这时为3,所以第二题计算结果为5。 很简单,第2个是i++完以后再去使用i的值相加,这时候i==3 把(i++)就当做是i 看, (i++)以后出现的i 值才是(i+1);而(++i)就是直接把i 的值当做(i+1)的值看.这样就很清楚了System.out.println(i + (i++); 把i++当做i看. 2+2=4System.out.println((i++) + i); i++后又出现i. 2+3=5 我是这样理解的第一种方法: 因为 i值等于2 i++值等于2 相加完以后运算就结束了。。 所以等于4第二种方法: 因为 i++ 值是 2 加上 i的值2 所以等于4 这个结果在运算完相加以后最后才要进行递增 所以得5 i + i++ 其实执行的 还是 2+2 i++ +i 是2+3 前面的 i=2 ++ 之后 后面的i 就等于三了! 这个只要知道运算符的执行顺序 就不难! 后缀++是先运算,后自增,所以i+(i++)也就是2+2 ,因为是先运算,所以此行println()结束,所以结果是4如果后面有代码使用到i,那么i的值就会是3了(i++)+i 也就是 先运算后自增,即2+3 ,也就是5 告诉你 记着 把i++ 当成i 一样的 i++ 就是先运算再加1 ++i 就是先自加1 在运算 int i = 2;int x = i; // x = 2int y = i; // i++,先返回自增前的i,y = 2i = i + 1; // i++,然后自增System.out.println(x + y); // 2 + 2int i = 2;int x = i; // i++,先返回自增前的i,x = 2i = i + 1; // i++,然后自增int y = i; // y = 3System.out.println(x + y); // 2 + 3 i+(i++) 2+2(i++)+i 2+3 i=2i+(i++)计算步骤:1: 将i的值2赋给(i++)—>(i++)=2 2:执行i=i+1=3 3: 执行i+(i++)=2+2=4计算步骤:1:1: 将i的值2赋给(i++)—>(i++)=2 2:执行i=i+1=3 3:执行(i++)+1=2+3=5; 首先 i++ 是参加运算“以后”再进行 i=i+1第一种情况,i=2,输出为 2+2=4,然后i的值变为3第二种情况,i=2,i++先进行运算,结果为2,但是这时,i=i+1=3,所以后面的部分变为3,输出为2+3=5 System.out.println((i++) + i)第二次取i的时候i已经加完 可以将方法作为一个参数传递到另一个方法中吗 求大虾指教 关于IOException的问题 急 为什么web.xml不支持taglib子标签 HttpURLConnection的connect()方法作用 请教SMSlib库收短信实时监控的方法~ java 怎样得到创建的所有线程 我是个新手,有没有推荐一本JAVA的书!!!!!!!!!! 急:JTree中如何点击执行文件? java的开发环境该怎么样配置啊? 很奇怪的关于socket和IO流的问题,大家都来看啊…… 这个错误谁知道,没有头绪啊!!!! 正则表达式 匹配点好怎么匹配!
L0
LINENUMBER 9 L0
ICONST_2
ISTORE 0
L1
LINENUMBER 10 L1
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ILOAD 0 //从index为0的地方载入i
ILOAD 0 //同上
IINC 0 1 //自增index为0的地方1
IADD // 这里和index 0一点儿关系都没有了,结果当然是4
INVOKEVIRTUAL java/io/PrintStream.println(I)V
LINENUMBER 14 L0
ICONST_2
ISTORE 0
L1
LINENUMBER 15 L1
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ILOAD 0 //从index为0的地方载入i i=2
IINC 0 1 //自增index为0的单元,这时候i=3了
ILOAD 0 //从index为0的地方载入i,i=3
IADD // 2+3=5
INVOKEVIRTUAL java/io/PrintStream.println(I)V
那么实现这一个操作,方法就不同了。
第一种方法,先将i作为(i++)这个表达式的值,然后与其他操作数进行运算,整个表达式都算完后,再进行i++操作。VC6.0编译出来的程序,就是这么做的。而且用这种方法计算的话,你的表达式当然都会是4.
而Java使用的方法,只能说明,它先将i作为表达式i++的值,与左边的操作符结合进行运算等到一个值c,运算完后就进行i++操作,然后再将c与右边的操作符结合进行运算,那么这时候,右边的表达式中有i,这个i自然是已经修改过后的了。
如果用于自增,++i和i++是一样的效果。
不过,如果用于赋值的话,++i是先加1再赋值,i++是先赋值后加1。
挺有意思的问题。不过看结果应该知道是Java编译器是如何处理的了。
而(++i)就是直接把i 的值当做(i+1)的值看.这样就很清楚了
System.out.println(i + (i++); 把i++当做i看. 2+2=4
System.out.println((i++) + i); i++后又出现i. 2+3=5
第一种方法: 因为 i值等于2 i++值等于2 相加完以后运算就结束了。。 所以等于4
第二种方法: 因为 i++ 值是 2 加上 i的值2 所以等于4 这个结果在运算完相加以后最后才要进行递增 所以得5
i++ +i 是2+3 前面的 i=2 ++ 之后 后面的i 就等于三了!
这个只要知道运算符的执行顺序 就不难!
后缀++是先运算,后自增,所以i+(i++)也就是2+2 ,因为是先运算,所以此行println()结束,所以结果是4如果后面有代码使用到i,那么i的值就会是3了(i++)+i 也就是 先运算后自增,即2+3 ,也就是5
i++ 就是先运算再加1
++i 就是先自加1 在运算
int x = i; // x = 2
int y = i; // i++,先返回自增前的i,y = 2
i = i + 1; // i++,然后自增
System.out.println(x + y); // 2 + 2int i = 2;
int x = i; // i++,先返回自增前的i,x = 2
i = i + 1; // i++,然后自增
int y = i; // y = 3
System.out.println(x + y); // 2 + 3
(i++)+i 2+3
i+(i++)
计算步骤:1: 将i的值2赋给(i++)—>(i++)=2
2:执行i=i+1=3
3: 执行i+(i++)=2+2=4
计算步骤:1:1: 将i的值2赋给(i++)—>(i++)=2
2:执行i=i+1=3
3:执行(i++)+1=2+3=5;
第二次取i的时候i已经加完