0

この投稿から(そしてそれだけでなく)、値を返す式に++演算子を適用できないという点に到達しました。そして、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式を制限することを選択したからですか、それとも予測できない結果につながる明確なケースがあるからですか?

4

2 に答える 2

2

機能をサポートする価値があるためには、それが本当に役立つ必要があります。提示したコードは、いずれの場合も、通常の2進加算演算子を使用するだけの代替コードよりも読みにくくなっています。例えば:

for (int i = 0; i < GetCount() + 1; i++) { }

私はすべて、言語チームが読めないコードを書くことを防ぐことに賛成です。あなたがそれを行うことができるすべての場合において、より簡単な代替手段があります。

于 2013-01-21T17:36:36.837 に答える
0

これらの演算子を使用する前に、それらがどのように実行するかを理解する必要があります。特に、接尾辞と接頭辞の違いを理解する必要があります。これは、許可されているものと許可されていないものを理解するのに役立ちます。

++および--演算子は、オペランドを変更します。つまり、オペランドは変更可能でなければなりません。問題の式に値を割り当てることができる場合、その値は変更可能であり、おそらく変数(c#)です。

これらの演算子が実際に何をするかを見てみましょう。接尾辞演算子は、コード行の実行後にインクリメントする必要があります。プレフィックス演算子に関しては、メソッドがまだ呼び出される前に、値にアクセスできる必要があります。私が構文を読み取る方法は、++lvalue (or ++variable)変換中memory operations:[read, write, read]または変換中lvalue++ [read, read, write]ですが、多くのコンパイラーはおそらく2次読み取りを最適化します。

したがってfoo()++;、値を見ると、コードの実行の中心で死んでしまいます。つまり、コード行の実行が終了した後、コンパイラーは、値に対して操作を実行するために、値をより長期的にどこかに保存する必要があります。これは、C++がこの構文もサポートしていない正確な理由であることは間違いありません。

参照を返す場合、コンパイラは接尾辞に問題はありません。もちろん、C#の値型(つまり、int、char、floatなど)は型であるため、参照によって渡すことはできません。

于 2015-07-06T21:05:20.803 に答える