3 回答
TA貢獻1790條經驗 獲得超9個贊
在評估i++或之后,兩種情況下++i的新值都是i相同的。增量前和增量之間的差異在于評估表達式本身的結果。
++i遞增i并計算為的新值i。
i++計算舊的值i,并遞增i。
這在for循環中無關緊要的原因是控制流大致如下:
測試條件
如果是假,則終止
如果是真的,執行正文
執行增量步驟
因為(1)和(4)是去耦的,所以可以使用前增量或后增量。
TA貢獻1804條經驗 獲得超7個贊
嗯,這很簡單。上述for循環在語義上等同于
int i = 0;while(i < 5) {
printf("%d", i);
i++;}和
int i = 0;while(i < 5) {
printf("%d", i);
++i;}請注意這些行i++;和++i;從本塊代碼的角度來看具有相同的語義。它們對值i(將其遞增1)具有相同的效果,因此對這些循環的行為具有相同的影響。
請注意,如果將循環重寫為,則會有所不同
int i = 0;int j = i;while(j < 5) {
printf("%d", i);
j = ++i;}int i = 0;int j = i;while(j < 5) {
printf("%d", i);
j = i++;}這是因為在第一個代碼塊中j看到i增量之后的值(i首先遞增,或者預先遞增,因此名稱),并且在第二個代碼塊中j看到i增量之前的值。
TA貢獻1995條經驗 獲得超2個贊
您的代碼的結果將是相同的。原因是兩個增量操作可以看作是兩個不同的函數調用。這兩個函數都會導致變量遞增,只有它們的返回值不同。在這種情況下,返回值只是丟棄,這意味著輸出中沒有可區別的差異。
然而,在引擎蓋下有一個區別:后增量i++需要創建一個臨時變量來存儲原始值i,然后執行增量并返回臨時變量。預增量++i不會創建臨時變量。當然,任何體面的優化設置都應該能夠在對象簡單的情況下優化它int但請記住,++ - 運算符在迭代器等更復雜的類中被重載。由于兩個重載方法可能具有不同的操作(例如,可能希望輸出“嘿,我是預先遞增的!”到stdout),當不使用返回值時,編譯器無法判斷方法是否等效(基本上因為這樣的編譯器可以解決無法解決的暫停問題),如果你寫的話,它需要使用更昂貴的后增量版本myiterator++。
你應該預先增加的三個原因:
您不必考慮變量/對象是否可能具有重載的增量后方法(例如在模板函數中)并以不同方式對待它(或者忘記以不同方式對待它)。
一致的代碼看起來更好。
- 3 回答
- 0 關注
- 586 瀏覽
添加回答
舉報
