邏輯運算中,關於i++ 、 ++i和i+=1、i=i+1 等這類問題是也筆試必考內容之一,基礎中的基礎。如果不會,那就已經可以看出你個人的基礎水平了。雖然看上去簡單,但是不懂原理是不行的。只有了解原理才能記憶最深
i++:先賦值,在相加,實戰以下,看以下**++i:先相加,在賦值
public
class
test
public
static
intprint2()
public
static
void
main
(string[
] args)
}
執行結果為:1,2,0,2;
我們獲取以下方法執行時的指令集
public
static
intprint1()
public
static
intprint2()
檢視彙編指令如下
0: iconst_0 //將int型別常量0壓入棧
1: istore_0 //將int型別值存入區域性變數
2: iload_0 //第乙個int型區域性變數進棧
3: iinc 0,1
//把乙個常量值加到乙個int型別的區域性變數上,0 表示區域性變數索引
6: ireturn //將運算元棧棧頂的值返回個此方法的呼叫者
linenumbertable:
line 5:0
line 6:2
public
static
intprint2()
; code:
0: iconst_0 //將int型別常量0壓入棧
1: istore_0 //將int型別值存入區域性變數
2: iinc 0,1
//把乙個常量值加到乙個int型別的區域性變數上,0 表示區域性變數索引
5: iload_0 //第乙個int型區域性變數進棧
6: ireturn //將運算元棧棧頂的值返回個此方法的呼叫者
linenumbertable:
line 5:0
line 6
:2i=i++到底是怎麼執行的
public
class
incvoid
fermin
(int i)
}//答案是0; inc.fermin(i); 是乙個干擾項,考值傳遞還是引用傳遞
i+=1 會進行自動進行型別轉換,相當於如下效果:
short i =1;
i=(short
)(i+1)
;
i i 1和i 1完全等價嗎?
可能有很多程式設計師認為i 1只是i i 1的簡寫方式,其實不然,它們乙個使用簡單賦值運算,乙個使用復合賦值運算,而簡單賦值運算和復合賦值運算的最大差別就在於 復合賦值運算子會自動地將運算結果轉型為其左運算元的型別 看看以下的兩種寫法,你就知道它們的差別在哪兒了 1 byte i 5 i 1 2 b...
Mysql中( i i 1)的作用
oracle中有乙個偽列rownum,可以在生成查詢結果表的時候生成一組遞增的序列號。mysql中沒有這個偽列,但是有時候要用,可以用如下方法模擬生成一列自增序號。1 sql示例 select i i 5 as rownum,surname,personal name from student,se...
Mysql中( i i 1)的作用
oracle中有乙個偽列rownum,可以在生成查詢結果表的時候生成一組遞增的序列號。mysql中沒有這個偽列,但是有時候要用,可以用如下方法模擬生成一列自增序號。1 sql示例 select i i 5 as rownum,surname,personal name from student,se...