この投稿から(そしてそれだけでなく)、値を返す式に++演算子を適用できないという点に到達しました。そして、5++が5+ 1として書く方が良いことは本当に明らかです。私は、インクリメント/デクリメント演算子の周りのすべてを要約したいと思います。それでは、少なくとも初めて++に固執する人に役立つ可能性のあるこれらのコードスニペットを見ていきましょう。
// Literal
int x = 0++; // Error
// Constant
const int Y = 1;
double f = Y++; // error. makes sense, constants are not variables actually.
int z = AddFoo()++; // Error
概要:++は、変数、プロパティ(合成糖を介して)、およびインデクサー(同じ)に対して機能します。
ここで、関心のある部分です。リテラル式はCSCで最適化されているため、次のように記述します。
int g = 5 + 1; // This is compiled to 6 in IL as one could expect.
IL_0001: ldc.i4.6 // Pushes the integer value of 6 onto the evaluation stack as an int32.
5 ++の場合、5が6になるという意味ではありません。x++ = x + 1のように、5+1の省略形である可能性があります。この制限の背後にある本当の理由は何ですか。
int p = Foo()++ //? yes you increase the return value of Foo() with 1, what's wrong with that?
論理的な問題につながる可能性のあるコードの例を高く評価します。
実際の例の1つは、配列よりも1つ多くのアクションを実行することです。
for (int i = 0; i < GetCount()++; i++) { }
たぶん、使用法の欠如は、同様の機能を回避するためにコンパイラチームを選択しますか?私はこれが私たちに欠けている機能であると主張しません。私はそうではありませんが、コンパイラの作成者にとってこれの暗い面を理解したいだけです。しかし、メソッドで参照を返すときにc++がこれを許可することは知っています。私はC++の人ではなく(知識が非常に乏しい)、制限の本当の要点を知りたいだけです。たとえば、C#の人が++ over value式を制限することを選択したからですか、それとも予測できない結果につながる明確なケースがあるからですか?