亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

'for'循環內的后增量和預增量產生相同的輸出

'for'循環內的后增量和預增量產生相同的輸出

C++ C
天涯盡頭無女友 2019-07-23 18:05:43
'for'循環內的后增量和預增量產生相同的輸出以下for循環產生相同的結果,即使一個使用后增量和另一個預增量。這是代碼:for(i=0; i<5; i++) {     printf("%d", i);}for(i=0; i<5; ++i) {     printf("%d", i);}我為兩個'for'循環得到了相同的輸出。我錯過了什么嗎?
查看完整描述

3 回答

?
富國滬深

TA貢獻1790條經驗 獲得超9個贊

在評估i++或之后,兩種情況下++i的新值都是i相同的。增量前和增量之間的差異在于評估表達式本身的結果。

++i遞增i并計算為的新值i。

i++計算舊的值i,并遞增i。

這在for循環中無關緊要的原因是控制流大致如下:

  1. 測試條件

  2. 如果是假,則終止

  3. 如果是真的,執行正文

  4. 執行增量步驟

因為(1)和(4)是去耦的,所以可以使用前增量或后增量。


查看完整回答
反對 回復 2019-07-23
?
三國紛爭

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增量之前的值。


查看完整回答
反對 回復 2019-07-23
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

您的代碼的結果將是相同的。原因是兩個增量操作可以看作是兩個不同的函數調用。這兩個函數都會導致變量遞增,只有它們的返回值不同。在這種情況下,返回值只是丟棄,這意味著輸出中沒有可區別的差異。

然而,在引擎蓋下有一個區別:后增量i++需要創建一個臨時變量來存儲原始值i,然后執行增量并返回臨時變量。預增量++i不會創建臨時變量。當然,任何體面的優化設置都應該能夠在對象簡單的情況下優化它int但請記住,++ - 運算符在迭代器等更復雜的類中被重載。由于兩個重載方法可能具有不同的操作(例如,可能希望輸出“嘿,我是預先遞增的!”到stdout),當不使用返回值時,編譯器無法判斷方法是否等效(基本上因為這樣的編譯器可以解決無法解決的暫停問題),如果你寫的話,它需要使用更昂貴的后增量版本myiterator++

你應該預先增加的三個原因:

  1. 您不必考慮變量/對象是否可能具有重載的增量后方法(例如在模板函數中)并以不同方式對待它(或者忘記以不同方式對待它)。

  2. 一致的代碼看起來更好。

  3. 當有人問你“你為什么預先增加?” 您將有機會向他們講述編譯器優化的暫停問題和理論限制。:)


查看完整回答
反對 回復 2019-07-23
  • 3 回答
  • 0 關注
  • 586 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號