[英]Is post-increment operator guaranteed to run instantly?
假設我有以下代碼:
int i = 0;
func(i++, i++);
返回值后立即發生增量? 是否保證第一個參數為 0,第二個參數為 1?
這段代碼被破壞有兩個原因:
不,你的代碼是錯誤的。 函數參數的求值之間沒有序列點,兩個對同一個對象有副作用的操作只有在它們被序列點分隔時才被允許。
C 中不存在“立即運行”的概念。最接近的可能是順序操作的想法,其中上述順序點強制分隔兩個語句或表達式的執行。
是否保證第一個參數為 0,第二個參數為 1?
不。它的未定義行為。 不能保證函數參數的求值順序是從左到右或從右到左,即求值順序是未指定的,因此對i
副作用是無序的。
如果相對於對同一標量對象的不同副作用或使用同一標量對象的值進行的值計算,標量對象的副作用是未排序的,則行為未定義 [...]
當您編寫i++
,您要求發生兩件事:
i
的值並加一i
現在,您必須了解的是,盡管 #1 會立即發生,但#2 不會。 考慮#2 的正確方式是它發生在“稍后”。 這就是為什么我們不能說func(i++, i++);
做。 我們無法知道i++
的一個是在第二個i++
發生之前還是之后將其結果存儲回i
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.