2017-04-21 72 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

我不明白的是爲什麼後遞增i++,從Increment方法,它在ref上執行(不在傳入變量的副本上)會增加變量,但稍後會被忽略。

我的意思是在這個視頻:

有人能解釋一下這個例子,爲什麼在調試期間我看到值增加1,但隨後又回到0?

+0

當執行'返回i ++'時,i(它是0)的值在它遞增前返回。當增量可能發生時,該值將被丟棄,因爲它已經返回。試着做'return ++ i;'來代替。 – shahkalpesh

+0

是的,但是你正在更新參考....它不應該回落到0.並且它被執行,因爲調試器中的值被更新爲1 – Sidewinder94

+0

這是因爲後增量運算符。 嘗試閱讀Eric Lippert的這個優秀答案,以瞭解後增量如何工作: http://stackoverflow.com/questions/3346450/what-is-the-difference-between-i-and-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,瞭解細節,現在它爲什麼是1,再次變成0。 – 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 ...因此在+操作之後i被賦值爲0執行

+3

與優先級無關,所有與從左到右的評估有關。 –

+0

仔細閱讀...運算符優先權!=操作優先順序...從左到右依次排列... – DarkSquirrel42

+4

我仔細閱讀。你寫得不好。使用正確的術語 - 操作順序,而不是優先順序。優先級決定如何從不明確的輸入構建AST。操作/評估順序決定了AST如何評估結果。使用短語'操作優先'既不意味着。 –

0

正如你所提到的 - postincrement「i ++」。聲明 - 「返回i ++;」將在返回原始值後在內存中設置'i'的值。

嘗試使用「return ++ i;」可能你會得到它。

+1

我不認爲這是正確的。語句'返回i ++;'遞增'i',然後返回'i'的前一個值,它是0.我從Eric Lippert的答案中獲取這些信息:http://stackoverflow.com /問題/ 3346450 /什麼,是最差之間-I型和I/3346729#3346729 –