-2

ポスト インクリメント/デクリメントとプリ インクリメント/デクリメントの違いについて誰かが尋ねると、通常、プレフィックス バージョンでは変数に 1 を追加して変数の新しい値を返すのに対し、ポストフィックス バージョンでは変数に 1 を追加してから返すという回答が返ってきます。古い値を返します。

いじり回しているうちに、これらの行はすべて合法であることがわかりました。

int i = 1;
++i;
++++++++++++++i;
(++++++++++++++i)++;
(++++++(++++(++i)))++;
------i;
--++++--++----++i;
i+=++++++++++++++i+i++-i--; 

ただし、次の行はどれも有効ではありません。

i++++;
++i++;
--i--;

接頭辞のバージョンが参照によって返されると仮定すると、これはすべて理にかなっています (接尾辞は接頭辞よりも優先されるため、最後の例でも)。

プレフィックス バージョンが参照を返し、ポストフィックス バージョンが値を返すという仮定/実現は正しいですか? pre/post inc/decrement 演算子について、私が知らない他の微妙な動作の違いはありますか?

4

4 に答える 4

2

これはすべて合法です:

いいえ、合法ではありません。そのように変数を複数回書き込むことは、未定義の動作です。構文的には正しく、コンパイルされますが、合法ではありません。

于 2011-06-29T22:50:11.843 に答える
1

C++ では、プレフィックスのインクリメント/デクリメント式は左辺値を「返し」、後置バージョンは右辺値を返します。C では、どちらの形式も右辺値を返します。

ただし、2 つのシーケンス ポイント間で変数に 2 回以上書き込もうとすると、動作が未定義になることに注意してください。したがって、区別はとにかく重要ではありません。

于 2011-06-29T22:54:51.483 に答える
0

頭に浮かぶのは、同じステートメントで変数を少なくとも2回使用し、少なくとも1つのインスタンスがpre/postインクリメントを適用するという一般的なコーディングエラーです。

i = i++;
于 2011-06-29T22:47:26.220 に答える
0

プレフィックス バージョンが参照を返し、ポストフィックス バージョンが正しい値を返すという仮定/認識は正しいですか?

いいえ、なぜそう思いますか?これは組み込みの演算子であり、コンパイラは必要に応じて実装できます。

「合法的な」例はコンパイルできますが、シーケンスポイントなしで同じ変数を複数回読み書きするため、未定義の動作が発生します。

于 2011-06-29T22:48:31.967 に答える