一大早起来,本想做个小题练练手,没想到居然被难住了!!先把题目贴上,各位先做做看: 求输出结果
1.public static void main(String[] args){ int j=0; for (int i = 0; i < 100; i++) { j = j++; } System.out.println(j); 2.
[java] view plaincopy
- public static void main(String[] args){
-
int i, sum1, sum2;
-
i=0;
-
sum1 = (i++)+(i++);
-
System.out.println("sum1="+sum1);
-
i = 0;
-
sum2 = (++i)+(++i);
-
System.out.println("sum2="+sum2);
- }
/答案在页尾不许偷看答案在页尾不许偷看答案在页尾不许偷看答案在页尾不许偷看************/
在涉及到自增、增减符时,需要着重注意,在计算的过程中,java使用了中间变量缓冲机制。 在java中,执行自增、自减运算时,系统会为每个自增操作分配一个临时变量。如果是前缀(++i),就会【先自加1再赋值给临时变量】;如果是后缀(i++),就会【先赋值给临时变量再自加1】。运算最终使用的,不是变量本身,而是被赋值后的临时变量,注意了!!
比如说第一题中循环中的 j = j++; 操作,其实等价于: temp = j ; //先赋值 j = j + 1; //再加一 j = temp; //最终使用的是 临时变量 所以可以知道输出结果为: 0
第二题中 i=0; sum1 = (i++) +(i++); 和题一相同,i先赋值给临时变量temp,然后i自增为1,此时第二个自增中i已经为1了,注意! 还是先赋值给临时变量2 temp2,然后自增; 最后sum1 等于 temp + temp2 ,结果为 1 。
i = 0; sum2 = (++i) + (++i); 第一个 ++i 先自增为1,并赋值给临时变量temp,此时i为1, 第二个 ++ i 自增为2,赋值给临时变量2 temp2 所以sum2 等于 第一个临时变量temp + 第二个临时变量temp2,结果为3.
一个不会的题牵引出了一个自己的漏洞,还好及时填补。开始我还在想是不是运算符优先级的问题? 看来对于运算符优先级也不是很清楚,在此贴上一张运算符优先级表,与君共勉。
[java] view plaincopy
- 优先级 操作符 含义 关联性 用法
-
- 1 [ ] 数组下标 左 array_name[expr]
-
. 成员选择 左 object.member
-
( ) 方法参数 左 method_name(expr_list)
-
( ) 实例构造 左 class_name(expr_list)
-
++ 后缀自增 左 lvalue++
-
-- 后缀自减 左 lvalue--
- 2 ++ 前缀自增 右 ++rvalue
-
-- 前缀自减 右 --lvalue
-
~ 按位取反 右 ~expr
-
! 逻辑非 右 !expr
-
+ 一元加 右 +expr
-
- 一元减 右 -expr
- 3 ( ) 强制转换 右 (type)expr
-
new 对象实例化 右 new type()
-
new type(expr_list)
-
new type[expr]
- 4 * 乘 左 expr * expr
-
/ 除 左 expr / expr
-
% 求余 左 expr % expr
- 5 + 加 左 expr + expr
-
- 减 左 expr - expr
-
+ 字符串连接 左 strExpr + strExpr
- 6 >> 有符号右移 左 expr >> distance
-
>>> 无符号右移 左 expr >>> distance
- 7 < 小于 左 expr < expr
-
<= 小于等于 左 expr <= expr
-
> 大于 左 expr > expr
-
>= 大于等于 左 expr >= expr
-
instanceof 类型比较 左 ref instanceof refType
-
== 等于 左 expr == expr
-
!= 不等于 左 expr != expr
- 8 & 整数按位与 左 integralExpr & integralExpr
-
& 布尔与 左 booleanExpr & booleanExpr
- 9 ^ 整数按位异或 左 integralExpr ^ integralExpr
-
^ 布尔异或 左 booleanExpr ^ booleanExpr
- 10 | 整数按位或 左 integralExpr | integralExpr
-
| 布尔或 左 booleanExpr | booleanExpr
- 11 && 逻辑与 左 booleanExpr && booleanExpr
- 12 || 逻辑或 左 booleanExpr || booleanExpr
- 13 ? : 条件运算 右 booleanExpr ? expr : expr
- 14 = 赋值 右 lvalue = expr
-
*= 乘赋值 右 lvalue *= expr
-
/= 除赋值 右 lvalue /= expr
-
%= 模赋值 右 lvalue %= expr
-
+= 加赋值 右 lvalue += expr
-
+= 字符串连接赋值 右 lvalue += expr
-
-= 减赋值 右 lvalue -= expr
-
<<= 左移赋值 右 lvalue <<= expr
-
>>= 有符号右移赋值 右 lvalue >>= expr
-
>>>= 无符号右移赋值 右 lvalue >>>= expr
-
&= 整数按位与赋值 右 lvalue &= expr
-
&= 布尔与赋值 右 lvalue &= expr
-
|= 整数按位或赋值 右 lvalue |= expr
-
|= 布尔或赋值 右 lvalue |= expr
-
^= 整数按位异或赋值 右 lvalue ^= expr
-
^= 布尔异或赋值 右 lvalue ^= expr