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被重新赋值,打断了自增的步骤。

此问题研究至此就结束,这处女座的毛病啥时候能改,小问题追这么细。。。进度还差一大截

你可能感兴趣的:(C#)