2017年11月21日 星期二

[Trap & Pitfals] 順序點(sequence point)

順序點,也稱作序列點,是電腦程式中一些執行點,在該點處之前的求值的所有的副作用已經發生,在它之後的求值的所有副作用仍未開始。在CC++程序設計語言中,表達式的值依賴於它的子表達式的求值順序

無順序點(undefined behavior):
  • "+":
=>a = f()+g(), "+"不是一個順序點因此表達式中有可能先調用f() or g()
  • arguments:
=>f(a,b,c) 參數列表中的","不是逗號運算浮,故參數的求直順序未指定。
  • 當一個變量在一個表達式修改不止一次
=>一個典型的C語言例子是表達式i = i++
  • 其中i的結果值是有二義性的,依賴於表達式求值順序:自增運算可能發生在賦值之前、之後或者交錯進行
    • Clause 6.5#2 of the C99 specification: "Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored.
  • 在聲明序列的每個聲明(declarator)之間。例如,int x = a++, y = a++的兩次a++求值之間。[7]注意,此例不是逗號運算符(所以不是由左到右)


有順序點:

沒有留言:

張貼留言