簡體   English   中英

后增量運算符是否保證立即運行?

[英]Is post-increment operator guaranteed to run instantly?

假設我有以下代碼:

int i = 0;
func(i++, i++);

返回值后立即發生增量? 是否保證第一個參數為 0,第二個參數為 1?

這段代碼被破壞有兩個原因:

  • 在序列點之間訪問變量兩次,用於確定要存儲的值以外的其他目的,是未定義的行為。 函數參數的評估之間沒有序列點。 這意味着任何事情都可能發生,您的程序可能會崩潰和燒毀(或者更有可能顯示不正確或垃圾值)。
  • 函數參數的求值順序是未指定的行為,這意味着您無法知道哪個將首先求值。

未定義的行為和序列點

為什么這些構造(使用 ++)是未定義的行為?

不,你的代碼是錯誤的。 函數參數的求值之間沒有序列點,兩個對同一個對象有副作用的操作只有在它們被序列點分隔時才被允許。

C 中不存在“立即運行”的概念。最接近的可能是順序操作的想法,其中上述順序點強制分隔兩個語句或表達式的執行。

是否保證第一個參數為 0,第二個參數為 1?

不。它的未定義行為。 不能保證函數參數的求值順序是從左到右或從右到左,即求值順序是未指定的,因此對i副作用是無序的。

C11:6.5 表達式 (p2)

如果相對於對同一標量對象的不同副作用或使用同一標量對象的值進行的值計算,標量對象的副作用是未排序的,則行為未定義 [...]

當您編寫i++ ,您要求發生件事:

  1. 獲取i的值並加一
  2. 將結果存回i

現在,您必須了解的是,盡管 #1 會立即發生,但#2 不會 考慮#2 的正確方式是它發生在“稍后”。 這就是為什么我們不能說func(i++, i++); 做。 我們無法知道i++的一個是在第二個i++發生之前還是之后將其結果存儲回i

暫無
暫無

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

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