この質問はかなりの量尋ねられます。誰かがこの質問をするたびに、非常に多くの人が間違った答えを投稿することに注意してください。プログラミングの本を書き、それによって他の人に虚偽を教える人を含め、多くの人がこれらの演算子がどのように機能するかについて間違った考えを持っています。ここで他の答えを注意深く読んでください。
C#の動作の正しい分析については、以下を参照してください。
i++と++iの違いは何ですか?
C ++の場合、副作用が観察されている場合、どのような動作も正しい動作です。C ++は、増分の副作用がいつ表示されるかを定義しません。2つのコンパイラはそれを異なる方法で行うことができます。
従うべき良いルールは、どの言語でも副作用が発生する順序に依存しないことですが、信頼性が低いため、C++では確かにそれに依存しないでください。
あなたの特定のケースを見るには:
int x, y;
x = 1;
y = x + x++;
xとyが両方とも2であると報告します。これはC#では正しいです。C#での正しい動作は次のとおりです。
- yを変数として評価する
- xを値として評価します-それは1です
- x++を値として評価します。これにより、xが変数として評価され、元の値である1を取得し、その値である2をインクリメントし、次に2をxに割り当てて、元の値である1になります。
- 1 + 1、つまり2を評価します
- yに2を割り当てます。
したがって、C#ではxとyはどちらも2です。
C ++でも同じことができますが、右から左の順序で加算を評価することができます。つまり、次のことを行うことが許可されています。
- x++を値として評価します。これにより、xが変数として評価され、元の値である1を取得し、その値である2をインクリメントし、次に2をxに割り当てて、元の値である1になります。
- xを値として評価します-それは2です
- 1 + 2、つまり3を評価します
- yを変数として評価する
- yに3を割り当てます。
C++でもこれを行うことができます。
- x++を値として評価します。これにより、xが変数として評価され、元の値である1を取得し、その値をインクリメントします。これは2です...ここではステップが欠落しています...そして元の値である1になります。
- xを値として評価します-それは1です
- 1 + 1、つまり2を評価します
- xに2を割り当てます-前に欠落していたステップ。
- yを変数として評価する
- yに2を割り当てます。
したがって、C ++では、コンパイラー作成者の気まぐれに応じて、yを3または2として取得できます。C#では、常にyが2であることがわかります。C++では、インクリメントの割り当ては、発生する限り、いつでも発生する可能性があります。C#では、インクリメントの割り当ては、インクリメントされた値が計算された後、元の値が使用される前に行われる必要があります。(実行中のスレッドから観察した場合。別のスレッドからこのようなものを観察しようとしている場合、すべての賭けは無効になります。)
2番目の例では:
y = x++ + x;
C#では、必要な動作は次のとおりです。
- yを変数として評価する
- x++を値として評価します。これにより、xが変数として評価され、元の値である1を取得し、その値である2をインクリメントし、次に2をxに割り当てて、元の値である1になります。
- xを値として評価します-それは2です
- 1 + 2、つまり3を評価します
- yに3を割り当てます。
したがって、C#の正解は、yが3、xが2であるということです。
この場合も、C++はこれらの手順を任意の順序で実行できます。C++では次のことが許可されています。
- xを値として評価します-それは1です
- x++を値として評価します。これにより、xが変数として評価され、元の値である1を取得し、その値である2をインクリメントし、次に2をxに割り当てて、元の値である1になります。
- 1 + 1、つまり2を評価します
- yを変数として評価する
- yに2を割り当てます。
繰り返しますが、C ++では、正解は、コンパイラー作成者の気まぐれに応じて、yが2または3であるということです。C#では、正解はyが3であるということです。