一大早起来,本想做个小题练练手,没想到居然被难住了!!先把题目贴上,各位先做做看:
求输出结果
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 plain copy
- 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 plain copy
- 优先级 操作符 含义 关联性 用法
- ----------------------------------------------------------------
- 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