C語言 i 與i 詳解

2021-10-08 02:11:48 字數 1309 閱讀 6697

i++;++i;就c語言**來看,i++ 和 ++i 都只有一行,看起來似乎二者的執行效率一樣了?其實不是的,在學習c語言時,教材和老師一般都會強調 i++ 和 ++i 的區別,例如下面這段c語言**:

int i , j, k;i = 0;j = i++;i = 0;k = ++i;這段c語言**執行後,j 和 k 的值並不相等:j 等於 0,k 等於 1。既然執行結果有差異,那麼執行效率很有可能也是有差異的,事實的確如此。檢視上述c語言**對應的彙編**,如下:

c語言**對應的彙編**

我使用的編譯器為 gcc version 4.8.4。

可見,j=i++; 計算機需要 4 條指令來解釋,比執行 k=++i; 多出了一條指令。多出的一條指令為:在對 i 執行自加操作之前,先儲存 i 的當前值留作稍後使用(賦值為j)。

這樣看來,似乎 ++i 的執行效率比 i++ 高一些?

那為了寫出效率更高的c語言程式,以後是不是應該盡量使用 ++i,而不是 i++ 了呢?例如下面這樣的c語言**:

for(i=0; i<10; i++);for(i=0; i<10; ++i);是不是上面那行c語言**的執行效率低於下面的呢?只能說理論如此,實際上,現代c語言編譯器已經足夠聰明,它會根據上下文編譯c語言**。

應該明白,i++ 和 ++i 的效率差異主要來自於處理 i++ 時,需要先儲存 i 的當前值留作稍後使用。如果之後沒有人使用 i 的當前值,也就是說沒有c語言**讀取 i++ 的值,編譯器實在沒有必要儲存 i 的當前值了,因此就會將這一步優化掉。

為了便於分析,我們編寫下面這樣的c語言**:

int i = 0;i++;++i;

與上面的例子相比,區別在於在執行 i++ 時,沒有人關心 i 的當前值了。檢視這段c語言**對應的彙編**:

顯然,i++ 和 ++i 對應的指令是一模一樣的,不再有執行效率上的差異。

小結c語言中的 i++ 和 ++i 是有區別的,這就有可能帶來效率上的差異。如果有**關心 i++ 執行時的 i 當前值,程式在對 i 進行自加操作時,將不得不先儲存 i 的當前值,而 ++i 就無需儲存當前值,這就會帶來效率上的差異。如果沒人關心 i++ 的當前值,那麼現代大多數c語言編譯器將會將這一差異優化掉,此時 i++ 和 ++i 不再有效率上的差異。

通俗解釋:  i++ 與 ++i 在表示式中有差異,即: ++i先自增1再賦值。 i++先賦值再自增1.    不在表示式中,兩者無區別。

參考:

c語言中i 與 i的使用技巧

首先我們要先知道 i與i 的基本用法及其基本區別 i 先自加,在使用 i 先使用,再自加 粗略地看,i和i 的作用都相當於i i 1,但 i和i 的區別在於 i是先執行i i 1後,再使用i的值,而i 是先使用i的值後,再執行i i 1.假如i的原值是3,則下面兩個例子 j i i的值先變成4,再賦...

c語言中 i 和 i 問題!

關於 i 和 i 一 簡單地說,單獨使用時,就是 i i 1 二 a i,相當於 i i 1,a i 先i i 1,再使用i的值 a i 相當於 a i,i i 1 先使用i的值,再i i 1 前者是先自增,後賦值 後者是先賦值,後自增。三 單獨使用時,i 的效率要比 i 效率高。1 為什麼?在內建...

php中 i 與 i 的區分詳解

在程式設計時我們常會使用到i 和 i,那兩者之間有什麼區別呢,本教程就為大家詳細介紹一下。1 i 的用法 以 a i i 2 為例 先將 i 值加 1 也就是 i i 1 然後賦給變數 a 也就是 a i 則最終 a 值等於 3 i 值等於 3 所以 a i 相當於 i i 1 a i 2 i 的用...