回覆列表
  • 1 # O3V3O

    首先我們清楚的是這兩種寫法意義不同: ++i 表示先自增, 然後用新值進行後續運算; i++ 表示先使用原值進行後續運算, 之後再將變數自增.

    很明顯, 憑藉上面的表述我們什麼也看不出來, 於是我們需要深入到這兩種操作的實現.

    ++i 在實現時基本步驟如下(這裡只是進行了必要的分步, 根據處理器架構的不同, 實際執行時可能每步都需要一個或幾個指令): i 自增; 用 i 參與後續運算.

    i++ 在實現時基本步驟如下(這裡也只是必要的分步): 對 i 進行拷貝(為方便起見我們命名為i_copy); i 自增; 用 i_copy 參與後續運算.

    這樣我們可以看出 i++ 在實現時比 ++i 多走了一步, 即拷貝操作. 如此一來, 在單處理機上進行執行時, ++i 的執行速度要比 i++ 快, 如果重複很多這種操作, 那麼這種優勢將愈發明顯.

  • 2 # 大郎喝藥沒死

    ++i是左值,得到一個物件,先增i再運算表示式。i++是右值,得到一個值,把i先賦值到一個臨時變數運算表示式,再自增i。看你自己需要

  • 3 # TonyDeng

    傳統習慣,稱為“避免不必要的劣化”。一般語言層面,++i比i++快,在大量迭代的迴圈中,這點積累有時比較敏感,於是C程式設計師習慣寫這種明確優化的表示式。在現代優化很好的編譯器下,編譯階段智慧分析,會在可靠情形下自動調整語句,改為++i。其實,對現代編譯器來說,以往的手工優化經驗不少是過時的,你這樣寫,最終未必是如此,表面看起來很笨拙的程式碼,優化後可能很好,因為現代編譯器鼓勵程式設計師寫可閱讀性和可理解性良好的程式碼,優化由它們來,不需要你手工干預(甚至你自以為的優化可能是錯的有bug),所以網上或學院裡很多過去的經驗、技巧、祕技,其實是錯的或多餘的。

    寫直接、準確地表達思想和意圖的程式碼就是了,大多數情況下不要考慮優化的事。

  • 4 # insomic

    按需使用,沒有哪個用的多哪個用的少的說法,如果你希望本次操作使用當前值就用i++,如果你希望本次操作使用自增後的值就用++i

  • 5 # 不必執著一切皆虛幻

    j = i++;

    00401276 mov eax,dword ptr [ebp-4]

    00401279 mov dword ptr [ebp-8],eax

    0040127C mov ecx,dword ptr [ebp-4]

    0040127F add ecx,1

    00401282 mov dword ptr [ebp-4],ecx

    j = ++i;

    00401276 mov eax,dword ptr [ebp-4]

    00401279 add eax,1

    0040127C mov dword ptr [ebp-4],eax

    ++i的彙編語句稍微少點,效率些微高一點,在水貨程式設計師眼裡這個微不足道,但高階程式設計師絕對不會放過任何一個可以提升效率的點。

  • 6 # DeepLearning

    ++i

    先增加i的值,然後再返回已經被增加過i的值,比如

    i = 1

    j = ++i

    結果: i值是2,j值是2

    i++

    先增加i的值,但是返回i修改前原來的值,比如

    i = 1

    j = i++

    結果: i值是2,j值是1

    對於程式設計師喜歡在迴圈裡面寫++i,可能只是程式設計師的喜好,或者是遵循了K&R程式設計規範。

    在任何情況下,遵守“++i優先於i++”原則是沒錯的!

    大家對於++i與i++效能上也有諸多評論,在任何非學生專案的編譯器裡面,兩者效能沒有任何區別,何況現在的編譯器後端都是非常智慧的LLVM。注意是效能沒有任何區別,可以通過反彙編檢視生成的程式碼,效能上完全一樣!

    這裡我們討論的i顯然是一個簡單的整數變數,而不是C++中的一個物件,如果是物件的++操作,那就是另外一個問題了,因為operator++()它其實是一個函式,編譯器是對於臨時物件的處理是另外一個問題了,此處不表!

  • 7 # BianChengNan

    說實話,一般情況下哪個都行。但是前置++在複雜型別實現時,效率高(如果自己實現過一定能知道為什麼高)。所以為了形成喜歡,我強迫自己使用前置++。其實對於一般的索引,沒區別。

  • 8 # Iloveprogramming

    ++i返回的是左值表示式,還可以再次對它做遞增運算,譬如一次性讓i增加2,可以寫成++++i ,i++返回的是右值表示式,不能再對它做遞增運算,i++++,編譯會報錯

  • 9 # 程式碼Go說科技

    簡單資料型別,這兩個區別不大,迴圈域內的值都能全覆蓋的。

    i++ 的意思是先將i值存在一個臨時變數裡面,接著i 的值加1,最後將儲存在臨時變數裡的、更改前的值返回;而 ++i 的意思是先將 i 的值加1,然後返回更改後的i值。

    舉個栗子:

    a = ++i,相當於 i=i+1; a = i;

    a = i++,相當於 a = i; i=i+1。

    複雜物件時,需要過載++運算子。前置的++返回的是引用,後置的++則需要拷貝一次副本,增加了系統的開銷。

    建議複雜型別的時候使用前置++運算。

  • 10 # Kobe096

    ++i和i++在執行效率上不同。傳統的手工程式碼,彙編時操作指令的不同會造成效率的不同。但是現代程式設計階段,由於編譯器自我的優化效能,效率基本相同。對於內建型別,編譯器都會直接編譯出inc之類的指令,++i和i++沒有差別;對於自定義的型別,++i和i++會呼叫兩個不同的操作符過載函式,一般分別是T& T::operator++(), T T::operator++(int)。++i是先自增再賦值;i++是先賦值再自增。後者多了好幾個操作(引起了若干次的不必要的構造和析構),所以基本都會優先使用++i。

    總之,目前編譯器時代,兩種用法效率基本相同,對於程式設計師來說使用哪一種都是推薦的。

  • 11 # 24divistion7無止境

    字首和字尾是有區別的,用通俗易懂的話來說,你可以看成整體是呼叫一個函式,字首返回的是新值,字尾返回的是原值,原值要用一個變數儲存,以便更改之後用於返回原值。

    你只有一個這樣的函式,怎麼寫都無所謂,但如果有大量這樣的函式,而你又不需要原值。那麼,幹嘛要去寫字尾這樣的要多一個步驟,多一個變數,造成大量的時間和空間上的浪費。

  • 12 # 太陽E10000

    從C時代養成的習慣,我一直用i++的,看別人的程式碼, i++和++i基本都有。所以題主這個本身就是偽問題。如果迴圈體同時還要取值使用,那用i++更是比++i自然易用。

  • 中秋節和大豐收的關聯?
  • 如果鯊、喬、詹、佛、艾、魔、夢、勾、鳥、帥同一年參加NBA選秀大會,誰會是狀元?