2012-09-01 26 views
2

Cosider在以下表達式中的序列點下面的表達式的行爲是否被很好地定義?

i = (++i,i++,i); 

如果我是正確執行的步驟將是如下:

1)

++i, i++ 

2)

step1,i 

3)

i = step2 

對於第1步中的評估,對於被稱爲定義的構造(因爲在評估逗號運算符後有一個序列點),i的值應該只修改一次。但我認爲情況並非如此。因此它應該是未定義的。 請參閱此answer。這裏上面的表達被稱爲定義。我錯過了什麼嗎?

+1

C11最終草案的附錄C:*以下是5.1.2.3中描述的順序點:[...]在以下操作符的第一個和第二個操作數的評估之間:邏輯AND &&(6.5 0.13);邏輯OR || (6.5.14); **逗號,**(6.5.17)*您錯過了在'++ i'和'i ++'之間發生的序列點。 – DCoder

+0

我強烈建議使用'i + = 2'來代替,並避免這個問題。 :-) –

+0

@BoPersson這是關於發現可能存在的問題。我覺得這是很好的避免知道我們到底在躲避什麼。 – bubble

回答

4

以下指令的行爲已定義良好。

i = (++i, i++, i); 

的確有第一的評價和逗號(,)的所述第二操作數之間的序列點。該標準的附錄C雖然是信息性的,但提供了序列點的描述。

C11,附件C序列點

在5.1.2.3中描述的序列點以下:

- 功能指示符的函數調用中的評價和實際 參數之間和實際的通話。 (6.5.2.2)。

- 在以下操作符的第一個和第二個操作數的評估之間:邏輯AND & &(6.5.13);邏輯OR || (6.5.14); 逗號(6.5.17)。

- 在第一個操作數 的條件? :操作符以及第二個和第三個操作數的評估值(6.5.15)。 - 完整申報人結束: 申報人(6.7.6);

- 完整表達式的評估與下一個完整表達式的評估之間進行評估。以下是完整表達式: 初始值設定項不是複合文字(6.7.9)的一部分;表達式語句(6.8.3)中的 表達式;控制 表達式的選擇語句(if或switch)(6.8.4);控制while或do語句的表達式(6.8.5); for語句(6.8.5.3)的每個 (可選)表達式;返回語句(6.8.6.4)中的(可選的) 表達式。

- 緊接庫函數返回之前(7.1.4)。 - 在 之後,與每個格式化輸入/輸出功能 轉換說明符(7.21.6,7.29.2)相關聯的操作。

- 緊接在每次調用比較 函數之前以及之後,以及任何對比較函數的調用和作爲參數傳遞給該調用的任何對象的移動(7.22.5)之間。

相關問題