6

シーケンス ポイント全体に対する私の理解は基本的なものです。私が持っているのは、「シーケンスポイントに遭遇すると、以前の評価のすべての副作用が完全であることを確認できる」という大雑把な直感的な考えだけです。また、動作が未定義のようなステートメントでprintf("%d",a++,++a,a++)は、カンマはシーケンスポイントを意味しないのに対し、セミコロンは意味することも読みました。ですから、推測して直感に頼るのではなく、これに対する非常に厳密で決定的な答えが大いに役立つと感じています。

したがって、C では次のようなステートメントは安全で確実です。

int a=4,*ptr=&a;  //Statement 1

x+=4,y=x*2;  //Statement 2  (Assume x and y are integer variables)

はいの場合、どのように?特に 2 番目のケースで、コンマがシーケンス ポイントでない場合、代入で使用する前に、コンマがx増加したことをどのように確認できますか? 最初のステートメントでは、アドレスを に割り当てる前に、 が初期化され、メモリが割り当てられていることをどのように確認できますか? 安全にプレイして、上記に次を使用する必要があります。4y=x*2aptr

int a=4,*ptr;
ptr=&a;

x+=4;
y=x*2;

編集コンマ演算子についての私の理解は、それらのステートメントが安全であることを教えてくれます。しかし、シーケンスポイントとそのようなものがどのようprintf("%d",a++,++a,a++)に定義されていないかについて読んだ後、私は考え直しました。

4

2 に答える 2

12

関数呼び出しで関数の引数を区切るコンマは、コンマ演算子ではありません。コンマ演算子と同じようにつづられる句読点です。異なる関数引数の評価の間にシーケンス ポイントがないため、その場合に UB を取得します。

一方、あなたの表現では:

x+=4,y=x*2;

ここでのコンマコンマ演算子であり、シーケンス ポイントを導入します。UBはありません。

宣言では、宣言子間のコンマもコンマ演算子ではありません。ただし、完全な宣言子(別の宣言子の一部ではない宣言子) の最後にはシーケンス ポイントが導入されるため、次のような宣言になります。

int a = 2, b = a + 1;

はUBではありません。

于 2013-04-28T13:05:20.997 に答える
3

ここにはUBはありません。
C99 標準に従って:

C. Annex C (参考情報): シーケンス ポイント
#1 以下は、5.1.2.3 で説明されているシーケンス ポイントです。 --引数が評価された後の
関数の呼び出し(6.5.2.2)。 -- 次の演算子の最初のオペランドの終わり: 論理 AND && (6.5.13); 論理和 || (6.5.14); 条件付き?(6.5.15); コンマ、(6.5.17)。

したがって、関数呼び出しに関連するコンマ演算子はありません。コンマの存在にもかかわらず。

于 2013-04-28T12:50:30.343 に答える