(C)探討i++和++i

最近筆者在調試代碼時發現自己在對++運算符的理解上不夠深入,導致一個不應有的bug的出現。
在代碼書中或課堂上我們都知道++i和i++在作爲一個單獨語句使用時沒有區別,即相當於i=i+1; 而作爲語句的一部分時,如a=++i; 和a=i++; ++i先執行加1操作,再執行賦值操作(因++在前),而i++是先執行賦值操作,再執行加1操作(因++在後)。但這種論述未將其中更深的運行機制講出來,尤其是在if或while等判斷語句中,下面對其進行探討:
  1. 作爲單獨語句存在,如下面的兩段代碼:

    int i=0;
    
    if(i++){...}
    
    
    
    



    int i=0;
    
    if(++i){...}
    
    
    
    



    上面的條件判斷代碼雖然是以單獨語句出現,但編譯器將其等價於i++(或++i)>0,故在第一段代碼中先執行i>0判定,再執行i++,因此條件體裏的代碼不被執行;而在第二段代碼中先執行i=i+1,再執行i>0,因此條件裏代碼會被執行。


  2. 作爲語句的一部分存在,如下面的一段代碼:

    int i=4,j=3;
    
    if((i=j++)!=4){...}
    
    
    
    



    上面的代碼中括號()的優先級比!=的優先級高,但編譯器仍然將++運算符最後執行。即先執行賦值語句i=j,然後判定(i=3)!=4成立,最後執行j++,接下去執行條件體裏代碼。



綜上可知當i++作爲單獨條件語句進行判定時,即使沒有顯示地聲明與0的比較,編譯器仍將加上與0的比較;當i++作爲複合語句使用時,不管++是否在優先級更高的運算符中,++仍然最後才執行,即在當前所在語句操作執行之後。





class Test{
public static void main(String[] args){

int count=0;//把0賦值給count
for(int i=0;i<10;i++){ //for循環
count=count++;//count先賦值,再自增。count=0。自增以後並不賦值。
}
System.out.println("count="+count); //這個語句在循環體外,所以只打印一次count=0.
}
}
結果是count=0

值爲0:
過程爲:
1、JVM把count拷貝到臨時變量區
2、count值加1;
3、返回臨時變量區的值(特別注意);
4、返回值賦給count;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章