比较基础的题,但估计会有不少人做错。以下代码执行结果是什么import java.util.*;
public class Test {
public static void main(String[] args) {
int i = 0;
i = i++ + ++i;
int j = 0;
j = ++j + j++ + j++ + j++;
int k = 0;
k = k++ + k++ + k++ + ++k;
int h = 0;
h = ++h + ++h;
int p1 = 0, p2 = 0; int q1 = 0, q2 = 0;
q1 = ++p1;
q2 = p2++;
System.out.println("i = " + i);
System.out.println("j = " + j);
System.out.println("k = " + k);
System.out.println("h = " + h);
System.out.println("p1 = " + p1);
System.out.println("p2 = " + p2);
System.out.println("q1 = " + q1);
System.out.println("q2 = " + q2);
}
}
public class Test {
public static void main(String[] args) {
int i = 0;
i = i++ + ++i;
int j = 0;
j = ++j + j++ + j++ + j++;
int k = 0;
k = k++ + k++ + k++ + ++k;
int h = 0;
h = ++h + ++h;
int p1 = 0, p2 = 0; int q1 = 0, q2 = 0;
q1 = ++p1;
q2 = p2++;
System.out.println("i = " + i);
System.out.println("j = " + j);
System.out.println("k = " + k);
System.out.println("h = " + h);
System.out.println("p1 = " + p1);
System.out.println("p2 = " + p2);
System.out.println("q1 = " + q1);
System.out.println("q2 = " + q2);
}
}
j = 7
k = 7
h = 3
p1 = 1
p2 = 1
q1 = 1
q2 = 0
可以变成 c = a + b 其中a = i++ , b = ++i;
++ 在后,先赋值,后运算, ++ 在前先运算后赋值!
运行后,a的值为0 , i的值为1, 所以b的值为2
所以 i = i++ + ++i 的结果为 2!
其他的同理分析!
一定要注意 a = i++ 啊的值为i的初始值,然后i自增! i的值发生变化!
++操作在JAVA上来说比C要好理解多了,C上面就很晕的,不同的平台和解释器结果就不一样。
i = i++ + ++i; //2
int j = 0;
j = ++j + j++ + j++ + j++; //7
int k = 0;
k = k++ + k++ + k++ + ++k; //7
int h = 0;
h = ++h + ++h; //3
int p1 = 0, p2 = 0; int q1 = 0, q2 = 0;
q1 = ++p1; //1
q2 = p2++; //0
记住两点就好了 ++的优先级高于+运算 其次 就是k++和++k的区别 没啥难的 只要自己不乱 肯定没问题
等于 i = (i++)+(++i);
第一个括号里面的值 仍然为零 但是过了这个括号之后 也就是i已经被用过了一次 增加一。第二个括号当然为2了
只要弄懂这个下面的就都不难了
i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i++++i....
出来了,真够无聊的
int i = 0;
i = i++ + ++i;
int j = 0;
j = ++j + j++ + j++ + j++;
int k = 0;
k = k++ + k++ + k++ + ++k;
int h = 0;
h = ++h + ++h;
int p1 = 0, p2 = 0;
int q1 = 0, q2 = 0;
q1 = ++p1;
q2 = p2++; System.out.println("i = " + i);
System.out.println("j = " + j);
System.out.println("k = " + k);
System.out.println("h = " + h);
System.out.println("p1 = " + p1);
System.out.println("p2 = " + p2);
System.out.println("q1 = " + q1);
System.out.println("q2 = " + q2);
}
}i = 2
j = 7
k = 7
h = 3
p1 = 1
p2 = 1
q1 = 1
q2 = 0
0 iconst_0
1 istore_1 [i]
2 iload_1 [i]
3 iinc 1 1 [i]
6 iinc 1 1 [i]
9 iload_1 [i]
10 iadd
11 istore_1 [i]
12 iconst_0
13 istore_2 [j]
14 iinc 2 1 [j]
17 iload_2 [j]
18 iload_2 [j]
19 iinc 2 1 [j]
22 iadd
23 iload_2 [j]
24 iinc 2 1 [j]
27 iadd
28 iload_2 [j]
29 iinc 2 1 [j]
32 iadd
33 istore_2 [j]
34 iconst_0
35 istore_3 [k]
36 iload_3 [k]
37 iinc 3 1 [k]
40 iload_3 [k]
41 iinc 3 1 [k]
44 iadd
45 iload_3 [k]
46 iinc 3 1 [k]
49 iadd
50 iinc 3 1 [k]
53 iload_3 [k]
54 iadd
55 istore_3 [k]
56 iconst_0
57 istore 4 [h]
59 iinc 4 1 [h]
62 iload 4 [h]
64 iinc 4 1 [h]
67 iload 4 [h]
69 iadd
70 istore 4 [h]
72 iconst_0
73 istore 5 [p1]
75 iconst_0
76 istore 6 [p2]
78 iconst_0
79 istore 7 [q1]
81 iconst_0
82 istore 8 [q2]
84 iinc 5 1 [p1]
87 iload 5 [p1]
89 istore 7 [q1]
91 iload 6 [p2]
93 iinc 6 1 [p2]
96 istore 8 [q2]
98 getstatic java.lang.System.out : java.io.PrintStream [16]
101 new java.lang.StringBuilder [22]
104 dup
105 ldc <String "i = "> [24]
107 invokespecial java.lang.StringBuilder(java.lang.String) [26]
110 iload_1 [i]
111 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [29]
114 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [33]
117 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]
120 getstatic java.lang.System.out : java.io.PrintStream [16]
123 new java.lang.StringBuilder [22]
126 dup
127 ldc <String "j = "> [42]
129 invokespecial java.lang.StringBuilder(java.lang.String) [26]
132 iload_2 [j]
133 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [29]
136 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [33]
139 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]
142 getstatic java.lang.System.out : java.io.PrintStream [16]
145 new java.lang.StringBuilder [22]
148 dup
149 ldc <String "k = "> [44]
151 invokespecial java.lang.StringBuilder(java.lang.String) [26]
154 iload_3 [k]
155 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [29]
158 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [33]
161 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]
164 getstatic java.lang.System.out : java.io.PrintStream [16]
167 new java.lang.StringBuilder [22]
170 dup
171 ldc <String "h = "> [46]
173 invokespecial java.lang.StringBuilder(java.lang.String) [26]
176 iload 4 [h]
178 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [29]
181 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [33]
184 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]
187 getstatic java.lang.System.out : java.io.PrintStream [16]
190 new java.lang.StringBuilder [22]
193 dup
194 ldc <String "p1 = "> [48]
196 invokespecial java.lang.StringBuilder(java.lang.String) [26]
199 iload 5 [p1]
201 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [29]
204 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [33]
207 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]
210 getstatic java.lang.System.out : java.io.PrintStream [16]
213 new java.lang.StringBuilder [22]
216 dup
217 ldc <String "p2 = "> [50]
219 invokespecial java.lang.StringBuilder(java.lang.String) [26]
222 iload 6 [p2]
224 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [29]
227 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [33]
230 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]
233 getstatic java.lang.System.out : java.io.PrintStream [16]
236 new java.lang.StringBuilder [22]
239 dup
240 ldc <String "q1 = "> [52]
242 invokespecial java.lang.StringBuilder(java.lang.String) [26]
245 iload 7 [q1]
247 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [29]
250 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [33]
253 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]
256 getstatic java.lang.System.out : java.io.PrintStream [16]
259 new java.lang.StringBuilder [22]
262 dup
263 ldc <String "q2 = "> [54]
265 invokespecial java.lang.StringBuilder(java.lang.String) [26]
268 iload 8 [q2]
270 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [29]
273 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [33]
276 invokevirtual java.io.PrintStream.println(java.lang.String) : void [37]
279 return
Line numbers:
[pc: 0, line: 6]
[pc: 2, line: 7]
[pc: 12, line: 8]
[pc: 14, line: 9]
[pc: 34, line: 10]
[pc: 36, line: 11]
[pc: 56, line: 12]
[pc: 59, line: 13]
[pc: 72, line: 14]
[pc: 78, line: 15]
[pc: 84, line: 16]
[pc: 91, line: 17]
[pc: 98, line: 19]
[pc: 120, line: 20]
[pc: 142, line: 21]
[pc: 164, line: 22]
[pc: 187, line: 23]
[pc: 210, line: 24]
[pc: 233, line: 25]
[pc: 256, line: 26]
[pc: 279, line: 27]
Local variable table:
[pc: 0, pc: 280] local: args index: 0 type: java.lang.String[]
[pc: 2, pc: 280] local: i index: 1 type: int
[pc: 14, pc: 280] local: j index: 2 type: int
[pc: 36, pc: 280] local: k index: 3 type: int
[pc: 59, pc: 280] local: h index: 4 type: int
[pc: 75, pc: 280] local: p1 index: 5 type: int
[pc: 78, pc: 280] local: p2 index: 6 type: int
[pc: 81, pc: 280] local: q1 index: 7 type: int
[pc: 84, pc: 280] local: q2 index: 8 type: int
}
!!~!!!!
以下注意看可能理解错误了
请教高手我记得一本书上写JAVA的编译器是贪婪的+++++会看成++和++和+
i = i++ + ++i; i=2这个为什么不错难道自动优化了
h = ++h + ++h; h=3还有这个东西为什么看成 ++h++ +h
j = 7
k = 7
h = 3
p1 = 1
p2 = 1
q1 = 1
q2 = 0
i= i+++++i;//2int j=0;
j=++j+ j+++ j+++ j++;//7int k=0;
k= k+++ k+++ k+++++k;//7int h=0;
h=++h+++h;//3int p1=0, p2=0;int q1=0, q2=0;
q1=++p1;//1 q2= p2++;//0
记住两点就好了 ++的优先级高于+运算 其次 就是k++和++k的区别 没啥难的 只要自己不乱 肯定没问题 没错!!up!!
刚开始做的时候自己都做错了!!基础不好啊!
能知道编译器是贪婪的,这已经算不错了。
你说得很对:i+++++i当然会看成++和++和+
但楼主是:i+++ ++i;注意中间加了一个空格,这很重要,这是分隔符。这样就会看成:++,+,++了。
这个不是什么自动优化,而是空格分隔符超了作用。
同样:++h+++h会看成:++,++,+,从而编译错。而写成:++h+ ++h;中间加了一个空格,又是分隔符起作用了。这道题没有什么难度。若做错,是因为不了解++i,i++与赋值=运算次序。即:=运算是最后做的。
我记得以前我用VC++编译器写
int i = 0;
int n = ++i + ++i;
结果n是等于4的,第一个++i变成1,第二个++i变成2,最后是2+2=4然后我刚才用Eciplse运行式一了一下
int n = (++i) + (++i);
n等于3
然后我改成相减去int n = (++i) - (++i);
结果n等于-1,说明首先是第一个++i变成1,第二个++i变成了2,然后是1 - 2 = -1