x + = x ++

翻訳を小さな調査から始めたいと思います。 C#プログラミング言語で記述している.NET開発者への質問。



翻訳の終わりに投票します。



今日、私はC#言語開発者の内部リストを見ました。 質問の1つは、式「x + = x ++」の動作、つまり正しい動作がどうあるべきかについてでした。 この質問はおもしろいものだと思うので、ブログエントリを専用にすることにしました。 しかし、初心者にとっては、このようなコードを決して書かないでください。



OK、始めましょう...



例として次のコードを使用します。



int x = 3; x += x++;
      
      





コンパイラがコードz + = yを検出したときに最初に行うことは、それをz = z + yに変換することです。 これは、演算子+ =、-=、* =、/ =に対して明らかに当てはまります。



OK、それは簡単でした。 これで、この式の意味を簡単に計算できます。



 x = x + x++;
      
      





このコードは、コードと同じ結果を返します。



 x = x + x;
      
      





ただし、コードでは異なる結果が得られます。



 x = x++ + x;
      
      





次のコードでも同じ結果が得られます。



 x = x + ++x;
      
      





この振る舞いがどのようにあなたを狂わせようと、それは本当にある場所を持っています。 しかし、最初に、x ++と++ xの違いは何ですか?という質問に答えましょう。 x ++は、現在の式のx値を返し、1ずつ増やします。 ++ xは、xを1つインクリメントし、増加した値を現在の式に返します。 上記の(およびC#が式を左から右に処理することを考えると)前のコードがそのように機能する理由を理解できます。



 int x = 3; x = x + x++;
      
      





コンパイラはこの式を次のように計算します。



  1. x =(x)+ x ++->最初のxがカウントされ、値3、x = 3が返されます。
  2. x = 3 +(x)++-> xが計算され、3、x = 3が返されます。
  3. x = 3 +(x ++)-> x ++は値3を返し、xは1ずつ増加します。x= 4。
  4. x =(3 + 3)->式3 + 3が計算され、6、x = 4が返されます。
  5. (x = 6)-> xには値6が割り当てられます(以前の値4を上書きします)。


次に、このようなコードの結果がどうなるかを見てみましょう。



 int x = 3; x = x++ + x;
      
      





  1. x =(x)++ + x-> xが計算され、値3、x = 3が返されます。
  2. x =(x ++)+ x-> x ++は値3を返し、xは1ずつ増加します。x= 4。
  3. x = 3 +(x)-> xが計算され、値4、x = 4が返されます。
  4. x = 3 + 4->式3 + 4が計算され、値7、x = 4が返されます。
  5. (x = 7)-> xには値7が割り当てられます(以前の値4を上書きします)。


次のコードを検討してください。



 int x = 3; x = x + ++x;
      
      





  1. x =(x)+ ++ x->最初のxがカウントされ、値3、x = 3が返されます。
  2. x = 3 +(++ x)-> ++ xはxを1つ増やし、4、x = 4を返します。
  3. x = 3 +(x)-> xが計算され、4、x = 4が返されます。
  4. x = 3 + 4->式3 + 4がカウントされ、7、x = 4が返されます。
  5. (x = 7)-> xには値7が割り当てられます(以前の値4を上書きします)。


すべてが明確になったことを願っています。 ところで、C ++では、そのような式の動作は定義されていません。



では、なぜこのような式の動作を決定したのでしょうか? なぜエラーについて話さないのですか、またはコンパイル時に警告がないのですか?





以前のオプションのどれが正しいかは重要ですか? そうではありません、 そのようなコードを書かないでください!



All Articles