x-の「戻り値」が必要であるという考えがどこにあるのか分かりません。まず、あなたが何を意味するのかはっきりとは分かりません。第二に、あなたが何を意味するかにかかわらず、これはx = x--
の未定義の動作の原因とは関係がないように思われます。
x = x--
は、介入するシーケンスポイントなしでx
を2回修正しようとするため、未定義の動作が発生します。ここでは「戻り値」の「必要性」はありません。
x = x--
の根底にある問題は、未定義の順序で未定義の瞬間に発生する2つの副作用があることです。 1つの副作用が代入演算子によって導入されます。 postfix --
演算子によって別の副作用が導入されました。両方の副作用は同じ変数x
を変更しようとし、お互いに一般的に矛盾します。そのため、このような場合の動作は定義されていないと宣言されています。例えば
、x
の元の値が5
れた場合、あなたの発現が同時に4
(デクリメントの副作用)と5
(割り当ての副作用)の両方になることx
を必要とします。言うまでもなく、x
が4
と5
に同時になることは不可能です。
UBには、このような直接的な矛盾(4
対5
など)は必要ありませんが。介入するシーケンスポイントなしで同じ変数に当たる2つの副作用があるたびに、これらの副作用が変数マッチに入れようとしている値であっても、その動作は未定義です。
出典
2011-02-07 17:33:29
AnT
正式な理由の他に、 'x = x - ; 'と書くことは意味をなさないことをご理解ください。 'x - ;'を単独で書くか、 'x = x - ;'の2番目の '-'を' 1' ... –
@Rに置き換えてください。私はそれを別の言い方で尋ねたほうがよいかもしれません: 'x = 0 - 'x = x - 'のように定義されていないのはなぜですか?' –
形式的な観点から、 'x'は一度だけ変更されるためです。常識的な見地からは、これが '--'演算子の全体点であるため、それは変更されて左辺値になり、古い値が得られます。何も怪しげなことはない。 –