問題タブ [sequence-points]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - このプログラムにはシーケンスポイントの問題がありますか?
j =(i ++、++ i、j * i);これは明確に定義されていますか?私の疑問を明らかにさせてください。
c++ - 論理積 (&&) を含む複雑な式
私は最近、シーケンス ポイントについて読み始めましたが、上記のコード サンプルが適切かどうかわかりません。演算子がシーケンス ポイントを導入することは知っている&&
ので、式 z = x && y && ++z の動作についてよくわかりません。だれか正解を教えてください。
c++ - シーケンスされていない値の計算(別名シーケンスポイント)
このトピックをもう一度開いて申し訳ありませんが、このトピック自体について考えると、未定義動作が発生し始めました。明確に定義された動作のゾーンに移動したい。
与えられた
上記の表現を(この順序で)次のように考えます
ここでの動作については、 C++0xからの重要な引用です。
$ 1.9 / 12-「式(または部分式)の評価には、一般に、値の計算(左辺値評価のためのオブジェクトのIDの決定と、右辺値評価のためにオブジェクトに以前に割り当てられた値のフェッチを含む)と副作用の開始の両方が含まれます。 。」
$ 1.9 / 15-「スカラーオブジェクトの副作用が、同じスカラーオブジェクトの別の副作用、または同じスカラーオブジェクトの値を使用した値の計算に比べて順序付けされていない場合、動作は定義されていません。」
[注:異なる引数式に関連する値の計算と副作用は順序付けられていません。—エンドノート]
$ 3.9 / 9-「算術型(3.9.1)、列挙型、ポインター型、メンバー型へのポインター(3.9.2)、std :: nullptr_t、およびこれらの型のcv修飾バージョン(3.9.3)はまとめて呼び出されますスカラー型。」
Expr1では、式
i
(最初の引数)の評価は、式(副作用があります)の評価に関して順序付けられていませんoperator++(i)
。したがって、Expr1の動作は未定義です。
Expr2では、式
i
(最初の引数)の評価は、operator++(i, 0)
(副作用がある)式の評価に関して順序付けられていません。したがって、Expr2の動作は未定義です。
Expr3では、 outerが呼び出される
operator++(i)
前に、lone引数の評価を完了する必要があります。operator++
したがって、Expr3の動作は明確に定義されています。
Expr4では、式
i
(最初の引数)の評価は、operator[](operator++(i, 0)
(副作用があります)の評価に関して順序付けられていません。したがって、Expr4の動作は未定義です。
この理解は正しいですか?
PSOPのように式を分析する方法が正しくありません。これは、@ Potatoswatterのように、次のように述べているためです。「13.6節は適用されません。13.6/ 1の免責事項を参照してください。」これらの候補関数は、13.3.1.2で説明されている演算子のオーバーロード解決プロセスに参加し、他の目的には使用されません。 「これらは単なるダミーの宣言です。組み込み演算子に関しては、関数呼び出しのセマンティクスは存在しません。」
c - 循環バッファでの簡潔なインデックス処理の提案
循環バッファーを実装しましたが、ラップアラウンドを適切に処理しながら、バッファーポインターを更新する簡潔な手段が必要です。
サイズ10の配列を想定すると、私の最初の応答は次のようになります。
静的分析、およびgcc -Wall -Wextraは、シーケンスポイント違反による不特定の動作について、私の手首を正しく叩きました。明らかな修正は次のようなものです。
しかし、私はこの操作を「カプセル化」するためのより簡潔なもの(つまり、ワンライナー)を探していました。提案?p++以外; p%= 10; :-)
c - C99 では、f()+g() は未定義ですか、それとも単に未指定ですか?
f
C99 では、関数とg
干渉の副作用があったとしても、式f() + g()
にシーケンス ポイントが含まれておらず、シーケンス ポイントが含まれている場合でも、その動作は未規定であるf
とg
考えていました: f() が前に呼び出されるg()、または f() の前に g()。
私はもはや確信が持てません。コンパイラが関数をインライン化し (関数が宣言されていなくてもコンパイラが実行することを決定する場合がありますinline
)、命令を並べ替えたらどうなるでしょうか? 上記の2つとは異なる結果が得られるでしょうか? つまり、これは未定義の動作ですか?
これは、私がこのようなことを書こうとしているからではなく、静的アナライザーでそのようなステートメントに最適なラベルを選択するためです。
c - 「int i = x++, j = x++;」です。法的?
タイトルでかなり明確だと思います。私はこれについて完全には確信が持てず、Google を介して適切な答えを見つけることができません (悲しいかな、私は標準化の芸術に取り組んでいません)。
これは定義されていますか?通常のステートメントは未定義の動作になると確信していますが、コンマ演算子はシーケンスポイントであり、合法ですが、初期化子がセミコロンで終了するか、次の変数が宣言され始めるかについて明確なソースはありません、そしてそれは使用中のコンマ演算子ではないため、明確な答えが見つかりません。したがって、a) コンマがイニシャライザを終了し、シーケンス ポイントであり、それが機能するか、b) 機能しないかのいずれかです。それはどれですか?i = x++, j = x++;
そして、排除するために、私は頭痛を単純化して、次のように書くべきであることを知っています:
そして、それが定義されていることを保証します。好奇心からさらに質問します。
c++ - シーケンスポイントについての説明
i = ++i + 1
最近、やのようなクレイジーでありながら構文的に許可されているコード ステートメントの出力について、多くの質問が寄せられるのを見てきましたi=(i,i++,i)+1;
。率直に言って、実際のプログラミングでそのようなコードを書く人はほとんどいません。したがって、私は通常、ここでそのような質問をスキップしてしまいます。しかし、最近、そのような Q が非常に多く聞かれるので、そのような Q を飛ばすことで重要な理論を見逃しているのではないかと考えさせられます。そのようなQは を中心に展開していると思いSequence points
ます。率直に言って、シーケンス ポイントについてはほとんど何も知りません。誰かが理論/概念を説明してもらえますかSequence points
、または可能であれば、概念について説明しているリソースを示します。また、この概念/理論について知るために時間を費やす価値はありますか?
c++ - この未定義の動作はなぜですか?
次の特定の式が未定義の動作を引き起こすのはなぜですか?
私の質問は、ここのアルスの質問の影響を受けています
c++ - 未定義の動作とシーケンス ポイント
「シーケンスポイント」とは?
未定義の動作とシーケンス ポイントの関係は?
a[++i] = i;
私は気分を良くするために、 のような面白くて複雑な表現をよく使います。なぜそれらの使用をやめなければならないのですか?
これを読んだ場合は、フォローアップの質問Undefined behavior and sequence points reloadedに必ずアクセスしてください。
(注: これはStack Overflow の C++ FAQへのエントリであることを意図しています。FAQ をこの形式で提供するという考えを批判したい場合は、すべての始まりとなった meta への投稿がそれを行う場所になります。回答への回答その質問は、FAQ のアイデアが最初に始まったC++ チャットルームで監視されているため、アイデアを思いついた人にあなたの回答が読まれる可能性が非常に高くなります。)c - gcc の -Wsequence-point 警告フラグは壊れていますか?
次の行で警告が表示されます。
を別のステートメントに移動する++s
と、警告が消えますが、私が知る限り、この警告は完全に間違っています。の値はs
、 の計算で一度だけ使用され++s
ます。の 2 番目の用途はs
、そのアドレスを取得することだけです。足りないものはありますか?