(さきほど一度投稿したのですが、あまりにも間違いが多かったのでコメント頂く前に削除しました。)
まず、C++のJIS X3014:2003では、
- 副作用完了点(sequence point)
以前に行った評価に伴うすべての副作用が完了し、それ以後に行われる評価に伴うすべての副作用がまだ発生しない、実行列中の地点。副作用完了点には以下のようなものがある。
・完結式の直後
・関数の実引数の評価直後
・関数の返却値のコピー直後
・論理和演算子(||)または論理積演算子(&&)の左辺の評価直後
・コンマ演算子の左辺の評価直後
C++では、
- JIS X3014:2003 1.9 プログラムの実行 16段落目
完結式の評価完了時点は、それぞれ副作用完了点となる。
CもC++の「完結式」と「完結式の評価完了時点は、それぞれ副作用完了点となる」が
それぞれ同じような意味で定義されていると仮定しての話ですが、具体例で考えてみました。
- (1) i = i+1; ok
(2) a = i; ok
(3) i = ++i + 1; 未定義。i が副作用完了点(完結式の評価完了時点)の間で2度変更されているから
(4) b = i + a[++i]; 未定義。副作用完了点(完結式の評価完了時点)の間で i が++iによる値の変更と、他の箇所で i を参照しているから(+演算子のオペランドの評価順序は未規定)
以下、特にわからない式
- (5) a[i++] = i; 未定義。左辺値式では、格納される値を決定するため以外の目的(i++はオペランドに格納されている値を更新する副作用がある部分式)で i を読み取っているから
(http://www.jpcert.or.jp/sc-rules/c-exp30-c.html より引用)
(6) a[i++] = 5; 未定義。(5)から同じ理由で未定義となる?
(7) b = i + a[i++]; 未定義。(5)から(4)とは違う理由で未定義となる?右辺値式で、格納される値を決定するため以外の目的(i++はオペランドに格納されている値を更新する副作用がある部分式)で i を読み取っているから、になる?
(8) a[++i] = 5; ok? 左辺値式の++iは格納されている値を決定する目的で i を読み取っているから
(9) b = a[++i]; ok? (8)と同じ理由から
(10) a[++i] = i; 未定義? 副作用完了点(完結式の評価完了時点)の間で左辺値式で++iによる i の値の変更と、右辺値式で i を参照しているから(=演算子のオペランドの評価順序は未規定)
上記例については動作する動作しないではなく、規格に沿っているか、未定義とされているか
についての疑問です。
ご指摘、ご教示お願い致します。