在加法、乘法和除法中优先使用C#

在加法、乘法和除法中优先使用C#,c#,division,multiplication,addition,operation,C#,Division,Multiplication,Addition,Operation,C#如何执行这一点 static void Main(string[] args) { int i = 4; i *= 4 + 8 / 2; Console.WriteLine(i); } 这是在一个采访问题中提出的。我把博德马斯应用到它上面。 但这是错误的。请解释。它的执行等同于以下代码: int i = 4; int temp = 8 / 2; temp = 4 + temp; i = i * temp; 编译器将缩短它

C#如何执行这一点

static void Main(string[] args)
    {

        int i = 4;

        i *= 4 + 8 / 2;
        Console.WriteLine(i);
    }
这是在一个采访问题中提出的。我把博德马斯应用到它上面。
但这是错误的。请解释。

它的执行等同于以下代码:

int i = 4;
int temp = 8 / 2;
temp = 4 + temp;
i = i * temp;
编译器将缩短它,因为它可以计算
i*=
右侧的常数,所以实际上它将编译为:

int i = 4;
i *= 8;

i*=4+8/2执行为:

i=i*(4+(8/2))


这是正确的阅读方法。

运算符的优先级在这一点上非常清楚:是一个乘法运算符,首先应用/,然后应用+。*=是赋值运算符,最后应用

因此:


你试过写一个程序来测试它吗?乘法和除法在赋值运算符的不同侧面-我想这就是导致你出现问题的原因。。。你的答案是什么?为什么?你观察到的实际结果是什么?你认为正确的答案是什么?最好是32岁……我想你不在面试了吧?打开你的IDE,设置一个断点,在面试结束时一次通过一个F11,他们会问如果你有任何问题,你应该问7月份一只非洲燕子的平均体重是多少。may be(i*temp)本身也是一个temp。这取决于你所说的temp是什么意思,但在IL代码中,它将临时驻留在堆栈上。这就是我的意思。它将再次被保存在temp变量中,并在之后分配给i.@LasseV.Karlsen,因此这意味着实际上C#也遵循BODMAS规则int i=4;i*=4+8/2*4;Console.WriteLine(i);`它给出的结果是c#中的80。根据BODMAS法则,结果是32,而不是80<代码>*=最后执行,因为它是赋值运算符,而不是乘法。
8 / 2 = 4
4 + 4 = 8
i *= 8;
so i will be 4 * 8 = 32;