問題タブ [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++ - (++i)++ は未定義の動作ですか?
(++i)++
未定義の動作ですか?後置インクリメントのインクリメントされたオブジェクトを取得した後に、前置インクリメントの副作用が発生する可能性はありますか? それは私には奇妙に思えるでしょう。
私の直感では、これは C++03 では定義されていませんが、C++11 では明確に定義されています。私は正しいですか?
java - Javaのシーケンスポイント
次の Java コードの実行シーケンスは保証されていますか?
普通の人が期待するように、getA()
常に の前に実行されますか?getB()
c++ - 代入演算子がシーケンスポイントではない正当な理由はありますか?
operator =
シーケンスポイントにならない正当な理由はありますか? C と C++ の両方で。
反例を考えるのが苦手です。
c++ - C++のシーケンスポイントと例外
throw()
コンパイラはC++で変数設定と操作を並べ替えることができますか?または、標準のC ++ 14882-1998は、この変換のコンパイラーを許可または禁止していますか?
コードの場合:
出力は
標準によると:「[intro.execution]#7」:
オブジェクトの変更..はすべて副作用であり、実行環境の状態の変化です。
シーケンスポイントと呼ばれる実行シーケンスの特定の指定されたポイントで、前の評価のすべての副作用が完了し、後続の評価の副作用が発生していないものとします。
throw
ステートメントはシーケンスポイントですか?
c++ - C/C++ コンパイラは、pthread ライブラリ呼び出し全体で変数をレジスタに合法的にキャッシュできますか?
次のコードがあるとします。
標準準拠の C/C++ コンパイラはdo_shutdown
、 への呼び出し全体で の値をレジスタにキャッシュできpthread_cond_wait()
ますか? そうでない場合、どの基準/条項がこれを保証していますか?
pthread_cond_wait()
コンパイラは、が を変更しないことを仮説的に知ることができdo_shutdown
ます。これはかなりありそうにないように思えますが、それを防止する標準を私は知りません。
実際には、C/C++ コンパイラdo_shutdown
は の呼び出し全体で の値をレジスタにキャッシュしますpthread_cond_wait()
か?
do_shutdown
コンパイラーがacrossの値をキャッシュしないことが保証されている関数呼び出しはどれですか? 関数が外部で宣言されていて、コンパイラがその定義にアクセスできない場合、コンパイラはその動作について何も仮定してはならないため、アクセスしないことを証明できないことは明らかですdo_shutdown
。コンパイラが関数をインライン化し、アクセスしないことを証明できる場合、マルチスレッド設定でもdo_shutdown
キャッシュできますか? do_shutdown
同じコンパイル単位内のインライン化されていない関数はどうですか?
c++ - 未定義の動作とシーケンスポイントがリロードされました
このトピックを次のトピックの続編と考えてください。
前の記事
未定義の動作とシーケンスポイント
この面白くて複雑な表現をもう一度見てみましょう(斜体のフレーズは上記のトピック* smile *から取られています):
これは未定義動作を引き起こすと言います。これを言うとき、私たちは暗黙のうちにタイプが組み込みタイプの1つであると仮定していると思います。i
タイプi
がユーザー定義タイプの場合はどうなりますか?そのタイプは、この投稿の後半で定義されていると言いますIndex
(以下を参照)。それでも未定義動作を呼び出しますか?
はいの場合、なぜですか?それは書くことと同等ではありませんi.operator+=(i.operator++());
か、あるいは構文的に単純 i.add(i.inc());
ですか?または、それらも未定義動作を呼び出しますか?
いいえの場合、なぜですか?結局のところ、オブジェクトは連続するシーケンスポイント間で2回i
変更されます。経験則を思い出してください。式は、連続する「シーケンスポイント間でオブジェクトの値を1回だけ変更できます。また、 が式の場合、undefined-behaviorを呼び出す必要があります。その場合、同等のもので あり、undefined-behaviorを呼び出す必要があります。真実ではないようです!(私が理解している限り)i += ++i
i.operator+=(i.operator++());
i.add(i.inc());
または、そもそも表現i += ++i
ではないですか?もしそうなら、それは何ですか、そして表現の定義は何ですか?
それが式であると同時に、その動作も明確に定義されている場合、式に関連付けられているシーケンスポイントの数は、式に含まれるオペランドのタイプに何らかの形で依存することを意味します。私は(部分的にでも)正しいですか?
ちなみに、この表現はどうですか?
応答でもこれを考慮する必要があります(その動作を確実に知っている場合)。:-)
は
C ++ 03で明確に定義されていますか?結局のところ、これはこれです、
side-effects - 評価順序が左から右の言語のシーケンスポイント?
評価順序が「左から右」として指定され、言語が(疑似)Cのようなものである場合、次の例のシーケンスポイントはどれですか。
c++ - このコードは明確に定義されていますか?
このコードは、ここで行われている議論から取られています。
このコードは明確に定義されていますか?++k
Fun()はSun()で以前に評価されてk
いますか?
k
組み込み型ではなく、ユーザー定義型の場合はどうなりますか?そして、上記の関数がorderを呼び出す方法は、これとどのように異なりますか。
私の知る限り、どちらの状況でも、各関数呼び出しの後にシーケンスポイントが存在します。もしそうなら、なぜ最初のケースも2番目のケースのように明確に定義できないのですか?
C ++ ISO標準のセクション1.9.17は、シーケンスポイントと関数評価について次のように述べています。
関数を呼び出すとき(関数がインラインであるかどうかに関係なく)、 すべての関数の引数(存在する場合) の評価後、関数本体の式またはステートメントの実行前に実行されるシーケンスポイントがあります。戻り値のコピー後、関数外の式の実行前にも シーケンスポイントがあります。
c - シーケンス ポイントに関するポスト インクリメント
ポストインクリメント演算子がインクリメントに影響を与えるのはいつですか? 私は2つの意見に出くわしました:
1) http://gd.tuwien.ac.at/languages/c/programming-bbrown/c_015.htmから:
POST は、代入操作の後に操作を実行することを意味します。
2)家に近づくと、SO(C ++ではありますが)に関する回答は次のように述べています。
...式の終わり(次のシーケンスポイント)までインクリメントを遅らせます。
ポストインクリメント操作もそうです...
A) シーケンスポイントに到達するまで待つか、
B) 代入演算子をポストするか、
C) シーケンス ポイントの前に発生しますか?
c++ - シーケンスポイントとメソッドチェーン
次の式は、未定義の不特定の動作を示すためによく使用されます。
f()
とg()
両方が一部の共有オブジェクトに副作用をもたらす場合、実行の順序が不明であるため、動作は未定義で指定されていません。f()
前に評価されるg()
か、またはその逆の場合があります。
今、オブジェクトのメンバー関数をチェーンするとどうなるのだろうと思っていました。クラスのインスタンスがあり、そのインスタンスが呼び出されobj
、2つのメンバー関数がfoo()
あり、bar()
どちらもオブジェクトを変更するとします。これらの関数の実行順序は可換ではありません。前後に呼び出すことの効果は、逆に呼び出すことと同じ効果ではありません。どちらのメソッドもへの参照を返す*this
ため、次のようにチェーンできます。
しかし、これは不特定の振る舞いですか?この表現と私が投稿の上部に示した表現を区別するものは、標準には見つかりません(確かにスキャンスルーするだけです)。両方の関数呼び出しは完全式の部分式であるため、実行の順序は指定されていません。ただし、変更するオブジェクトがわかるように、最初に評価するfoo()
必要があります。bar()
明らかな何かが欠けているかもしれませんが、シーケンスポイントがどこに作成されているかわかりません。