一大早起来,本想做个小题练练手,没想到居然被难住了!!先把题目贴上,各位先做做看: 求输出结果

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

  1. public static void main(String[] args){
  2.  int i, sum1, sum2;  
    
  3.  i=0;  
    
  4.  sum1 = (i++)+(i++);  
    
  5.  System.out.println("sum1="+sum1);  
    
  6.  i = 0;  
    
  7.  sum2 = (++i)+(++i);  
    
  8.  System.out.println("sum2="+sum2);     
    
  9. }

/答案在页尾不许偷看答案在页尾不许偷看答案在页尾不许偷看答案在页尾不许偷看************/

在涉及到自增、增减符时,需要着重注意,在计算的过程中,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. 优先级 操作符 含义 关联性 用法

  2. 1 [ ] 数组下标 左 array_name[expr]
  3.      .        成员选择      左    object.member   
    
  4.      ( )      方法参数      左    method_name(expr_list)   
    
  5.      ( )      实例构造      左    class_name(expr_list)   
    
  6.      ++       后缀自增      左    lvalue++   
    
  7.      --       后缀自减      左    lvalue--   
    
  8. 2 ++ 前缀自增 右 ++rvalue
  9.      --       前缀自减      右    --lvalue   
    
  10.      ~        按位取反      右    ~expr   
    
  11.      !        逻辑非        右    !expr   
    
  12.      +        一元加        右    +expr   
    
  13.      -        一元减        右    -expr   
    
  14. 3 ( ) 强制转换 右 (type)expr
  15.      new      对象实例化    右    new type()   
    
  16.                                   new type(expr_list)   
    
  17.                                   new type[expr]   
    
  18. 4 * 乘 左 expr * expr
  19.      /        除            左    expr / expr   
    
  20.      %        求余          左    expr % expr   
    
  21. 5 + 加 左 expr + expr
  22.      -        减            左    expr - expr   
    
  23.      +        字符串连接    左    strExpr + strExpr   
    
  24. 6 >> 有符号右移 左 expr >> distance
  25.      >>>      无符号右移    左    expr >>> distance   
    
  26. 7 < 小于 左 expr < expr
  27.      <=       小于等于      左    expr <= expr   
    
  28.      >        大于          左    expr > expr   
    
  29.      >=       大于等于      左    expr >= expr   
    
  30.   instanceof  类型比较      左    ref instanceof refType   
    
  31.      ==       等于          左    expr == expr   
    
  32.      !=       不等于        左    expr != expr   
    
  33. 8 & 整数按位与 左 integralExpr & integralExpr
  34.      &        布尔与        左    booleanExpr & booleanExpr   
    
  35. 9 ^ 整数按位异或 左 integralExpr ^ integralExpr
  36.      ^        布尔异或      左    booleanExpr ^ booleanExpr   
    
  37. 10 | 整数按位或 左 integralExpr | integralExpr
  38.      |        布尔或        左    booleanExpr | booleanExpr   
    
  39. 11 && 逻辑与 左 booleanExpr && booleanExpr
  40. 12 || 逻辑或 左 booleanExpr || booleanExpr
  41. 13 ? : 条件运算 右 booleanExpr ? expr : expr
  42. 14 = 赋值 右 lvalue = expr
  43.      *=       乘赋值        右    lvalue *= expr   
    
  44.      /=       除赋值        右    lvalue /= expr   
    
  45.      %=       模赋值        右    lvalue %= expr   
    
  46.      +=       加赋值        右    lvalue += expr   
    
  47.      +=    字符串连接赋值   右    lvalue += expr   
    
  48.      -=       减赋值        右    lvalue -= expr   
    
  49.      <<=      左移赋值      右    lvalue <<= expr   
    
  50.      >>=   有符号右移赋值   右    lvalue >>= expr   
    
  51.      >>>=  无符号右移赋值   右    lvalue >>>= expr   
    
  52.      &=    整数按位与赋值   右    lvalue &= expr   
    
  53.      &=       布尔与赋值    右    lvalue &= expr   
    
  54.      |=    整数按位或赋值   右    lvalue |= expr   
    
  55.      |=       布尔或赋值    右    lvalue |= expr   
    
  56.      ^=   整数按位异或赋值  右    lvalue ^= expr   
    
  57.      ^=     布尔异或赋值    右    lvalue ^= expr