討論i++和++i

關於一般使用:


情景1:單獨使用的時候


        int i=0,j=0;
        i++;
        j++;
        NSLog(@"i:%d,j:%d",i,j);


結果:i:1,j:1

結論:在這種情況下,兩者的效果都是 ii+1



情景2:i=++i


        int a,i = 0;
        
        a = ++i;
        
        NSLog(@"%d",a);

結果:1

結論:此時的操作是 1ii+12ai


情景3:ii++


int a,i = 0;
        
a = i++; //好分裂,誰這麼寫代碼,誰sx
        
NSLog(@"%d",a);


結果:0

結論:此時的操作是1ai2ii+1


關於效率


討論:他們的效率問題(標準情況下),會有編譯器針對性優化,然後就沒差了。

這裏有關於c++的討論。其他的語言在不同的編譯器下,不一定相同。


我們通常在寫for循環 的時候,要實現變量 i 的自增 1 ;往往會在i++ 和++i中隨便挑一種寫,對於i++和++i的理解,我們往往停留在返回的值的不同,其實i++與++i在實現效率上也有一定的不同(不考慮編譯器優化的原因)。

++i的實現效率更高

解釋如下:

i++ (在C++中) 在實現的時候,系統會產生一個 local object class INT的臨時變量 用於存儲原有的數據供返回值用;


++i 的實現方式   
INT INT::operator++()  
{  
    *this = *this +1;  
    return *this;  
}  
  
i++的實現方式  
  
const INT INT::operator++(int)  
{  
    INT oldvalue = *this;  
    *this = *this+1;  
    return oldvalue;  
} 

所以從效率上來說 ++i 比 i++來的更有效率。

++i更高效

說明:

1、在不考慮編譯器優化的條件下,前綴(++i)比後綴(i++)要少一步開闢臨時變量的操作,所以前綴效率更高。

2、對於內置數據類型,由於編譯器優化的原因,前綴和後綴的效率沒什麼差別。

例如:對於 int 型變量,編譯器可以優化掉開闢臨時變量這份多餘的工作。

3、對於自定義的數據類型(類),我們在使用 自增 運算符的時候,需要重載 ++ 運算符,在重載的時候,後綴要開闢一個臨時變量,所以前綴的效率要比後綴的更高。


關於效率的討論:Leo115




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