問題タブ [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++ - a = (a+b) - (b=a) が 2 つの整数の交換に適していないのはなぜですか?
一時変数やビットごとの演算子を使用せずに 2 つの整数を交換するために、このコードに出くわしました。
しかし、このコードには、評価の順序を決定するためのシーケンス ポイントa = (a+b) - (b=a);
が含まれていないため、swap ステートメントで未定義の動作があると思います。
私の質問は次のとおりです:これは2つの整数を交換するための許容可能な解決策ですか?
c - シーケンス ポイントと副作用: C11 の静かな変更?
C99 §6.5式
(1) 式は、値の計算を指定するか、オブジェクトまたは関数を指定するか、副作用を生成するか、またはそれらの組み合わせを実行する一連の演算子とオペランドです。
(2) 前のシーケンス ポイントと次のシーケンス ポイントの間で、オブジェクトの格納値は、式の評価によって最大 1 回変更されます。72)さらに、以前の値は、保存する値を決定するためにのみ読み取られるものとします。73)
脚注付き
72) 浮動小数点状態フラグはオブジェクトではなく、式内で複数回設定できます。
73) この段落は、次のような未定義のステートメント式をレンダリングします。
許可しながら
ここで、C11 §6.5 は次のように変更されました ((1) のテキストには補遺があります):
(1) […] 演算子のオペランドの値の計算は、演算子の結果の値の計算の前に並べられます。
(2) スカラー オブジェクトに対する副作用が、同じスカラー オブジェクトに対する別の副作用または同じスカラー オブジェクトの値を使用した値の計算と比較して順序付けされていない場合、動作は未定義です。式の部分式に複数の順序付けが許可されている場合、いずれかの順序付けでそのような順序付けされていない副作用が発生した場合の動作は未定義です。84)
ここで、C11 の脚注 84 は C99 の脚注 73 と同じです。
私は少し混乱しています… C11 (2) を「[…] (同じスカラー オブジェクトに対する異なる副作用) または (同じスカラー オブジェクトの値を使用した値の計算) […]」のように読みます。許可さえしませんfoo = ++i
(副作用があり、変更されたオブジェクトに応じて値を使用します)。ただし、私はネイティブ スピーカーではないので、この文をどのように「解析」する必要があるか教えていただければ幸いです。C99 は理解できますが、C11 の文言はよくわかりません。
とにかく、実際の質問: これは C99 から C11 への変更ですか、それともこれらの文言は同等ですか? もしそうなら、なぜ変更されたのですか?そうでない場合、誰かが C99 では UB であるが C11 では UB ではない、またはその逆の式の例を挙げてもらえますか?
c - この C ステートメントの順序は適切に定義されていますか?
この質問を定義する方法がよくわからないので、タイトルは少しあいまいです。
次のコードと関係があります。
for ループ内のステートメントは、順番に実行されることが保証されていますか?
たとえば、次のm_matchBase = match->requestedBase
後に実行されることが保証されていますmatch = match->next
か?
c++ - Sequence point && operator
For C++03, the standard says, that between left and right operand of && operator there is a sequence point, so that all side effects of left operator have taken place before right operator is accessed.
So
is well defined and is guaranteed to output 0
.
But what is about this question: is right operand only evaluated if left operand is not 0
? It seems to be a detail, but to me the standard guarantees only the sequence point between the operands, not that right operand is never evaluated/accessed in dependence of left one.
E.g.
Is this well defined? pos
could be from begin on 10
or reaches 10
. The left operand has no side effects which concur with right operand. Have I the guarantee that arr[10] != 0
is never performed?
Edit:
Thanks to the comments and answers it is clear now:
is the sequence point meaning.
is the short-circuit meaning.
The first without the second would make my example undefined. Thanks.
c++ - c++で割り当ての一方の側が他方の前に配列されていますか?
これは未定義の動作であることを理解しています:
i
左側と右側のの評価順序が定義されていないためです (;
が唯一のシーケンス ポイントです)。
その推論をさらに一歩進めると、これは次のようになると私には思えます未定義未指定の動作:
の右側にいくつかのシーケンスポイントがありますが、=
私が理解している限りではまだです未定義またはが最初に評価されるかどうf()
かは指定されていません。a[i]
私の仮定は正しいですか?代入の左側でグローバル変数または静的変数を使用し、右側がそれを変更しない場合、細心の注意を払う必要がありますか?