2017-04-21 3 views
59

私は完全に理解できない結果を返す単純なコンソールアプリケーションコードです。面白いインタビューの演習結果:返り値、ポストインクリメントおよび参照の振る舞い

することは、それが0を出力するかどうかを考えるのはコンソールで1または2を試してみてください:

using System; 

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main() 
     { 
      int i = 0; 
      i += Increment(ref i); 

      Console.WriteLine(i); 
      Console.ReadLine(); 
     } 

     static private int Increment(ref int i) 
     { 
      return i++; 
     } 
    } 
} 

答えは0

私は理解していないことIncrement方法から、なぜポストインクリメントi++ですref(渡された変数のコピーではない)で実行される変数は増分しますが、後で無視されます。

このビデオでは私は何を意味している:デバッグ中に私は、その値が1にインクリメントされて見たが、その後、それは0に戻り、なぜ

誰かがこの例を説明し、することはできますか?

+0

'return i ++'を実行するとき、iの値(0)はインクリメントされる前に返されます。インクリメントが発生する可能性がありますが、値はすでに返されているため、破棄されます。代わりに 'return ++ i;'を実行してみてください。 – shahkalpesh

+0

はい、しかしref ...を更新しています。これは0に戻らないはずです。デバッガの値が1 – Sidewinder94

+0

に更新されているため、実行されます。ポストインクリメント演算子のためです。 ポストインクリメントの仕組みを理解するために、この優れた答えをEric Lippertからお読みください。 http://stackoverflow.com/questions/3346450/what-is-the-difference-between-i--i/3346729#3346729 – Boney

答えて

101

i += Increment(ref i);

i = i + Increment(ref i); 

に相当する割り当ての右側の式は左から右に評価され、そう次のステップは

i = 0 + Increment(ref i); 

return i++されるの現在の値を返しますi(これは0)、次にインクリメントi

i = 0 + 0; 

割り当ての前にiの値は1(Incrementメソッドでインクリメント)ですが、割り当てによって再び0になります。

+3

...あなたは私より少し速かった;) – DarkSquirrel42

+0

詳細については、Jakubに感謝します。 – Aremyst

+0

その行が 'i = Increment(ref i)+ i'の場合、結果は異なるでしょうか?私はうそをつくことはありません。これは、左から右へのルールが私の精神モデルに影響を与えたのは初めてです...ブール値の短絡の外にありますよね。 – user1935361

17

私は「魔法」は、ここでの操作

i += Increment(ref i) 

の順序は

左から右へ+動作が実行される

i = i + Increment(ref i) 

と同じであるだけで 操作の優先順位 だと思います

だから私は最初に私は...その時点で0です...

次に、Increment(ref i)の結果を追加します。これも0 ... 0 + 0 = 0 ...ですが、その結果を得る前に私は実際にインクリメントされます...

私の+演算の左辺オペランドが評価された後にインクリメントが行われるので...事を変更しません... 0 + 0はまだ0です...したがって、+演算が実行された後に0が割り当てられます実行済み

+3

優先順位とは何も関係ありません。左から右への評価に関係しています。 –

+0

慎重に読んでください...演算子の優先順位!=演算の優先順位...左から右の順序になります... – DarkSquirrel42

+4

慎重に読んでいます。あなたはひどく書きました。適切な用語を使用してください - 優先順位ではなく、操作の順序。優先順位は、ASTがその他のあいまいな入力からどのように構築されるかを決定します。操作/評価の順序は、ASTがどのように評価されるかを決定します。 「操作の優先順位」という句を使用することはどちらも意味しません。 –

0

あなたが言及したように - ポストインクリメント "i ++"。ステートメント - "return i ++;"元の値が返された後、メモリに 'i'の値を設定します。

"return ++ i;"を試してみてください。おそらくあなたはそれを得るでしょう。

+1

これは正しいとは思わない。 'return i ++;'文は 'i'をインクリメントし、その後、' i'の前の値を返します。これは0です。私はここでエリック・リッパートの答えからその情報を得ています:http://stackoverflow.com/questions/3346450/what-is-the-difference-i-and-i/3346729#3346729 –

関連する問題