none
C# ++運算子 RRS feed

  • 問題

  • 想請教一下

    int a = 0;
    a=a++;
    
    
    

    為什麼顯示出來的a會是0而不會是1呢?

    當然我知道直接a++就好

    只是今天同事問我我也是覺得莫名其妙為什麼不是1 XD 試了很久一直測不出來原因 特上來請教各位前輩




    2016年8月18日 上午 06:21

解答

  • 這是因為計算的過程是個堆疊

    int a =0;

    a=a++ ;

    這個行為是這樣做的:

    (首先是 int a=0 ;)

    (1) push 0  到 stack

    (2) 從 stack pop 0 出來丟給 a 這個變數

    (接著來看 a=a++)

    (1) 取出變數表裡的 a 變數的值(也就是 0) push 到 stack.

    (2) 複製 stack 最上方的資料(此時 stack 只有一個 0 在裡面), 並且將複製的值 push 進去

    (以上我說的有點簡略, 總之此時的 stack 會有兩個 0)

    (3) 將 1 這個值 push 進 stack, 所以此時 stack 由上往下看的順序就是 1,0,0

    (4) 把最頂端的 1 pop 出來, 然後再將 0 pop 出來, 相加之後 push 回去, 所以 stack 變成 1,0

    (5) 因為 a= a++ , 所以堆疊中現在剩下的計算結果, 兩個都會 pop 出來丟給 a , 所以過程就是

    (5-1) 先 pop 1 出來 指派給 a (等號右邊的 a, 也就是自己)

    (5-2) 再 pop 0 出來指派給 a (等號左邊的 a, 恰好也是自己)

    這就是為什麼 a 永遠都會是零.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2016年8月18日 下午 01:44
    版主

所有回覆

  • 你在哪裡顯示 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年8月18日 上午 06:35
    版主
  • 抱歉 我用MessageBox.Show(a.ToString());

    出來的結果

    用中斷點看也都是0

    http://i.imgur.com/4KWFR22.png

    • 已編輯 IM_QQ 2016年8月18日 上午 07:03
    2016年8月18日 上午 07:01
  • a = a++ 是先回傳 a 後再 ++。

    如果你是用 a = ++a 的話就會是你想要的結果 (++a 是先 ++ 後再回傳 a)。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2016年8月18日 上午 07:09
    版主
  • 要得到1, 程式碼要改成:

    a=++a;

    2016年8月18日 上午 07:18
  • a = a++ 是先回傳 a 後再 ++。

    如果你是用 a = ++a 的話就會是你想要的結果 (++a 是先 ++ 後再回傳 a)。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    恩,這我知道
    只是不理解為什麼a=a++;他的值不會變
    照我的理解看 如果事先傳到a在++
    這樣下一行SHOW()出來應該是+過的數值(1)不是嗎@@?

    但顯示出來還是0
    下中斷點看還是0

    是我哪裡理解錯誤了嗎?

    2016年8月18日 上午 07:18
  • a = a++ 是先回傳 a 後再 ++。

    如果你是用 a = ++a 的話就會是你想要的結果 (++a 是先 ++ 後再回傳 a)。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    恩,這我知道
    只是不理解為什麼a=a++;他的值不會變
    照我的理解看 如果事先傳到a在++
    這樣下一行SHOW()出來應該是+過的數值(1)不是嗎@@?

    但顯示出來還是0
    下中斷點看還是0

    是我哪裡理解錯誤了嗎?

    a=a++;

    先回傳a=a,所以a=0,然後a++等於1,但沒有回傳,所以a還是等於0。

    應該是這樣吧,有錯請指教,謝謝。

    2016年8月18日 上午 07:27
  • 你只要記得 ++ 寫在後面表示回傳數值後再累加,寫在前面是先累加再回傳。

    如果你要深入去了解,就要扯到很多東西。

    https://zh.wikipedia.org/wiki/%E5%A2%9E%E5%80%BC%E5%92%8C%E5%87%8F%E5%80%BC%E6%93%8D%E4%BD%9C%E7%AC%A6


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2016年8月18日 上午 09:07
    版主
  • 這是因為計算的過程是個堆疊

    int a =0;

    a=a++ ;

    這個行為是這樣做的:

    (首先是 int a=0 ;)

    (1) push 0  到 stack

    (2) 從 stack pop 0 出來丟給 a 這個變數

    (接著來看 a=a++)

    (1) 取出變數表裡的 a 變數的值(也就是 0) push 到 stack.

    (2) 複製 stack 最上方的資料(此時 stack 只有一個 0 在裡面), 並且將複製的值 push 進去

    (以上我說的有點簡略, 總之此時的 stack 會有兩個 0)

    (3) 將 1 這個值 push 進 stack, 所以此時 stack 由上往下看的順序就是 1,0,0

    (4) 把最頂端的 1 pop 出來, 然後再將 0 pop 出來, 相加之後 push 回去, 所以 stack 變成 1,0

    (5) 因為 a= a++ , 所以堆疊中現在剩下的計算結果, 兩個都會 pop 出來丟給 a , 所以過程就是

    (5-1) 先 pop 1 出來 指派給 a (等號右邊的 a, 也就是自己)

    (5-2) 再 pop 0 出來指派給 a (等號左邊的 a, 恰好也是自己)

    這就是為什麼 a 永遠都會是零.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2016年8月18日 下午 01:44
    版主