num++位置自增問題【附上作者的猜測】

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            int num = 10;
            int number = num++ + num;

            Console.WriteLine(num);       //大佬們,請問num和number的應該是多少啊?
            Console.WriteLine(number);
            Console.ReadKey();
        }
    }
}

請問num的值和number的值是什麼?
A. 11;20
B. 11;21
C. 11;22


這裏計算會出問題,至少我不能理解。
問題:
1.如果num++是進行運算完再自增,那麼bumber應該是10+10=20,即答案是 A
2.或者說num++,系統不能識別它需要進行運算,所以進行了自增,那也應該是11+11=22,即答案是 C(我最開始的想法是num++前面沒有運算符,可能不會被識別爲運算。)
3.但是,答案是最令人想不到的 B


爲了達到我們想要的情況。所以請不要出現 【num++在num之前】 的狀況

錯誤實例:
number = num++ + num;

正確實例:
number = num + num++;


形成“BUG”的猜測:

  1. 首先我們瞭解num++是屬於後加,指運算後,再自增。
  2. 以代碼爲例,num++執行過程可能是這樣的:
    (假設num的值儲存在地址1111)
    ①.將num的值,即“10”,放到寄存器,儲存到某個地址,如地址1000。(這樣,地址1000與地址1111都儲存着“10”)
    ②.進行自增,寄存器形成新的值,即“11”,並將值返回到地址1111.(作者揣測num的值已經進行更新)
    ③.對代碼進行檢測,是否發生運算。
    IF:
    ④.如存在運算,num++取地址1000處的值,即“10”,並進行運算。
    ④.如不存在運算,直接執行⑥

⑤.運算結束後,再執行②;
⑥.清除地址1000的值


分析:
①.請注意,無論是不是後加,num的值已經更新,不同的是num++可能回返回到num未更新之前的值。
②.大家可以做個試驗:number=num++ + num 與 number=num + num++的值是不一樣的。
③.如果是這樣推的話,number=num++ + num(存在運算)就是在第④步,number=10(地址1000)+11(地址1111)
④.感謝於富大兄嘚的啓發。


關於num=num++ * 2(這裏假設num=50)
機器輸出是100,但是很明顯,缺少了自增的一步。
具體原因不清數,有可能是C11標準編譯器有問題(百度到的),也有可能是num被重新賦值,打斷了自增的步驟。

此問題研究至此就結束,這處女座的毛病啥時候能改,小問題追這麼細。。。進度還差一大截

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章