j = j++;
从 = 右边开始看 j 先将自己的值0 赋给左边的j ,然后右边的j 自己再++,此时的j=1,但对于左边的j 没有影响,左边的还是 0
这样,每次循环开始的时候,j 都是0
楼主可以换 j= ++j; 这样会有不同的答案,楼主试试
j++ 先做运算 j 后加1
++j j 先加 1 然后做运算
从 = 右边开始看 j 先将自己的值0 赋给左边的j ,然后右边的j 自己再++,此时的j=1,但对于左边的j 没有影响,左边的还是 0
这样,每次循环开始的时候,j 都是0
楼主可以换 j= ++j; 这样会有不同的答案,楼主试试
j++ 先做运算 j 后加1
++j j 先加 1 然后做运算
所以说 有两个j 并进行了两次赋值(一次是++ 完成的 一次是 = 完成的)我说的明白吗(操作数栈 :可以想想 CPU 中的浮点运算单元 FPU)
c++和java处理方式差别很大
个人觉得最好分开写,这种写法完全是为了考试用的
j = 1;
i = i ++ + + j;
System.out.println(i);
i = 1;
j = 1;
i = i ++ + + + j;
System.out.println(i);i = 1;
j = 1;
i = i + ++ j;
System.out.println(i);
i = 1;
j = 1;
i = i + + ++ j;
System.out.println(i);
java中的++还是比较有意思的;PS:可能和楼主的题目有些出入;
int j = 0;
for (int i = 0; i < 10; i++) {
//j = j++;
j++;
System.out.println(j);
} }}输出结果:1到10,,,表示不解中!!!
先取出j的值为0,然后再把j值加1,然后把刚才取得的0重新赋值给j,最终j还是0.
public static void main(String[] args) {
int j = 0;
for (int i = 0; i < 10; i++) {
j = j++;
System.out.println(j);
}
}
}你这里j=j++;是这样的计算的,j先等于j,即等于0,每次循环j都等于0。而后面的++是对0进行了加1。所以结果还是0.
你改成下面的代码即可:
public class TestJ {
public static void main(String[] args) {
int j = 0;
for (int i = 0; i < 10; i++) {
j = ++j;
System.out.println(j);
}
}
}
先将j的值作为j++这个表达式的值,然后j自加1,最后将表达式j++的值赋值给j,因为表达式j++的值为0,所以j又变成了0。
楼主可以改成j=++j。
//后++是指表达式的值不变,变量本身的值+1
//j++是个表达式,你将表达式的值赋给j,所以j没有变,还是原来的值
但是你知道计算机在干什么吗? 进行了很多步,如下:
第一步计算j++的值得到0,第二步j自增1变成1,第三步把第一步的值赋值给j,j又变成0;
分为三步运算:
1)取 j 的值作为表达式 j++ 的值,为 0;
2) j 作自增运算,此时 j 为 1,但表达式 j++的值依然为0;
3)将表达式 j++ 的值赋给 j,所以 j 又变成了0。
关于论据 ,我没有 。不过 我可以直接给你答案 :import java.util.Scanner;public class java { public static void main(String [] args){
int j = 0;
j = j++ + 5 - 3 - 2 ;
System.out.println(j);}
}Compiled from "java.java" 用javap -c java.class 得到字节码
public class java {
public java();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 4: 0 public static void main(java.lang.String[]);
Code:
0: iconst_0 // 常量0 压入操作数栈
1: istore_1 // 保存到局部变量
2: iload_1 // 将局部变量的值 压入操作数栈 (应该可以猜到 上面的 store 会弹出栈)
3: iinc 1, 1 // 关键的就是这一句 我也不知道是什么意思
//(可以看看 虚拟机规范 可以猜到的是 他不会改变栈 但是能改变局部变量)
6: iconst_5
7: iadd // + 5
8: iconst_3
9: isub // -3
10: iconst_2
11: isub //-2
12: istore_1 // j = 表达式 下面的就是调用 println 了
13: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
16: iload_1
17: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
20: return
LineNumberTable:
line 7: 0
line 8: 2
line 9: 13
}