3

強調された線の説明を探しています。

(C99 6.5.16 / 3)代入演算子は、左のオペランドで指定されたオブジェクトに値を格納します。代入式には、代入後の左オペランドの値がありますが、左辺値ではありません。代入式の型は、左オペランドが修飾型でない限り、左オペランドの型です。修飾型の場合は、左オペランドの型の非修飾バージョンです。左オペランドの格納値を更新する副作用は、前のシーケンスポイントと次のシーケンスポイントの間で発生します。

次の例を考えてみましょう。

int x = 42;
int y = 0;

int main()
{
   // side effect of modifying 'x'
   x = y;
}

前と次のシーケンスポイントは何ですか?mainの先頭にシーケンスポイントはありますか?

4

3 に答える 3

3

C99 5.1.2.3は、シーケンスポイントを、前の評価のすべての副作用が発生し、その後の評価の副作用がまだ発生し始めていない場所として定義しています。標準の付録Cは、シーケンスポイントが発生する場所を定義します。関数呼び出し、論理演算子の終了、コンマ演算子、および3項演算子、完全な宣言の終了、完全な式の終了などです。

この場合、前のシーケンスポイントはの開始でmain()あり、次のシーケンスポイントは割り当ての最後のセミコロンです。最初のシーケンスポイントでxは、値は42になり、2番目のシーケンスポイントでは0になります。

于 2012-12-28T12:33:18.113 に答える
0

これは、 CFAQからのシーケンスポイントについての説明です。

この場合、シーケンスポイントは完全な式の直前と直後にありますx = y;

于 2012-12-28T12:34:42.870 に答える
0

user4815162342の回答に追加するだけで、コメントするには長すぎます。ステートメントは順番に並べられます。

ステートメントは、実行するアクションを指定します。特に明記されている場合を除き、ステートメントは順番に実行されます。

したがって、経験則として;、標準では明示的に言及されていませんが、すべてにシーケンスポイントがあります。

于 2012-12-28T12:36:19.327 に答える