正しいあなたの質問に対する唯一の答えは次のとおりです。それは未定義だからです。
わかりました、あなたが皆私を燃やす前に...
あなたはみなi+=i++
、結果としてが大丈夫で論理的である理由を答えましたi=0
。
私はあなたの答えの1つ1つに反対票を投じようと誘惑されましたが、計算した評判のヒットは高すぎるでしょう。
なぜ私はあなたたちにそんなに怒っているのですか?あなたの答えが説明するもののためではありません。
私が読んだすべての答えは、不可能を説明するために多大な努力を払っていました、拍手!
しかし、結果は何ですか?それは直感的な結果ですか?それは許容できる結果ですか?
あなた方一人一人が「裸の王」を見て、どういうわけかそれを合理的な王として受け入れました。
あなたはすべて間違っています!
i+=i++;
結果 0
は未定義です。
もしそうなら言語評価メカニズムのバグ..またはさらに悪い!デザインのバグ。
証拠が欲しい?もちろん欲しい!
int t=0; int i=0; t+=i++; //t=0; i=1
これは...直感的な結果です!最初にt
値を割り当てて評価したので、評価と割り当ての後で初めて、事後操作が発生しました-合理的ではありませんか?
それは合理的ですか:i=i++
とi=i
同じ結果が得られi
ますか?
一方t=i++
、のt=i
結果は異なりますi
。
事後操作は、ステートメントの評価後に行われるべきものです。
したがって:
int i=0;
i+=i++;
私たちが書いた場合も同じでなければなりません:
int i=0;
i = i + i ++;
したがって、以下と同じです。
int i=0;
i= i + i;
i ++;
したがって、以下と同じです。
int i=0;
i = i + i;
i = i + 1;
1
合理的な考え方で行った場合、コンパイラのバグまたは言語設計のバグを示さない結果-ただし、MSDNおよび他の多くのソースは、「ちょっと-これは未定義です!」
さて、次に進む前に、私が与えたこの例のセットでさえ、誰もサポートも認めもしません。しかし、これは直感的で合理的な方法による結果であったはずです。
コーダーは、アセンブリがどのように記述または翻訳されているかを知る必要はありません。
言語定義を尊重しない方法で書かれている場合-それはバグです!
最後に、これをWikipediaからコピーしました。インクリメントおよびデクリメント演算子:
インクリメント/デクリメント演算子はオペランドを変更するため、同じ式内でそのようなオペランドを複数回使用すると、未定義の結果が生成される可能性があります。たとえば、x − ++ xなどの式では、減算演算子とインクリメント演算子をどの順序で実行する必要があるかが明確ではありません。このような状況は、コンパイラーによって最適化が適用されるとさらに悪化し、その結果、操作の実行順序がプログラマーの意図とは異なるものになる可能性があります。
したがって。
正解は、これは使用すべきではないということです!(未定義なので!)
はい..-C#コンパイラが何らかの方法で正規化しようとしても、予測できない結果になります。
言語の正常な動作または明確に定義された動作として文書化されたすべての動作を説明するC#の文書は見つかりませんでした。私が見つけたのは正反対です!
[ Postfixインクリメントおよびデクリメント演算子のMSDNドキュメントからコピー:++および- ]
後置演算子が関数の引数に適用される場合、引数の値は、関数に渡される前にインクリメントまたはデクリメントされることが保証されていません。詳細については、C ++標準のセクション1.9.17を参照してください。
保証されていない単語に注意してください...
その答えが傲慢に思われる場合は許してください-私は傲慢な人ではありません。私は何千人もの人々がここに学びに来て、私が読んだ答えは彼らを誤解させ、彼らの論理と主題の理解を損なうと考えています。