簡體   English   中英

前與后增量

[英]Pre vs Post Increment

我得到了前后增量的基礎,但是當它實際發生在后增量時,我無法理解。

例如,在以下增量后代碼中:

int counter = 10;
int result = 0;

result = counter++ + 10;

cout << "Counter: " << counter << endl;
cout << "Result: " << result << endl;

我知道Counter會出現11,結果為20.結果是20,因為整個函數正在運行, 然后當程序返回0時加上+1;

究竟是什么時候加上+1?

謝謝

究竟是什么時候加上+1?

根據標准

在修改操作數對象之前,對++表達式的值計算進行排序。

從外行人的角度來看:

  1. counter計算進行排序,這可能是聲明的整個RHS的一部分,或者只是counter++
  2. 在對程序中的下一個語句進行排序之前,對counter += 1計算進行排序。

要記住兩件事。

  1. 術語的值 - 它在表達式中的計算結果。
  2. 評估該術語的副作用。

counter++的情況下:

該項的值是counter增加之前的值。
評估該術語的副作用是增加counter的值。

后增量運算符:后增量運算符用於在完全執行表達式后遞增變量的值,其中使用后增量。 在Post-Increment中,值首先在表達式中使用,然后遞增。

所以在你的情況下

result = counter++ + 10;

在本聲明中使用后增量發生,顯然它會在下一個語句中反映出來。

另外,為了更好地理解,您可以考慮這些松散描述的示例:

  • 認為對於前期 -Increment的the_objectthe_type作為這樣的功能:
the_object = the_object + 1;
return the_object;
  • 現在想想 -Increment為the_objectthe_type作為這樣的功能:
the_type backup_of_the_object;
backup_of_the_object = the_object;
the_object = the_object + 1;
return backup_of_the_object;

現在考慮:

result = counter++ + 10;

編譯程序時:

  1. 編譯器在行的開頭看到result = ,因此它應該首先確定在=的右側放置的內容然后生成機器代碼以將其分配給=的左側,即result
  2. 編譯器看到counter但該語句尚未結束,因為; 尚未到達。 所以現在它知道它也必須用counter做一些事情。
  3. 編譯器看到++但語句尚未結束。 所以現在它知道它必須考慮生成機器代碼以首先執行counter++

  4. 編譯器看+ 所以,現在它知道它必須考慮生產機器代碼中加入右側+和左側+這是counter++

  5. 編譯器見10; 最后聲明已經結束。 所以現在它知道它需要知道的一切! 它知道,生產機器代碼執行后, counter++ ,它應該產生的機器代碼添加10到outcome_of它。 然后它應該生成機器代碼以將result_of分配給result

程序運行時:

  1. CPU應該執行counter++

現在counter是由1因此它是11,outcome_of(遞增counter++ )是以前的值counter10

  1. CPU應該執行outcome_ofcounter++ )+ 10

現在outcome_ofoutcome_ofcounter++ )+ 10)是outcome_of (10 + 10),即20

  1. CPU應該執行result = outcome_ofoutcome_ofcounter++ )+ 10)

現在result20

另請注意,所描述的每個階段都只是關於
result = counter++ + 10;
不管之后會發生什么。 以前的意思

cout << "Counter: " << counter << endl;
cout << "Result: " << result << endl;

很明顯在main()返回0之前。

在我看來,你應該放輕松,通過編寫和運行一些程序的經驗來學習它!

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM