Postfix的优先级高于前缀,因此给定代码中sml2的值应为2,但应为0。为什么?

问题描述 投票:1回答:1
namespace Randomedits
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = 2;
            int sml2 = ++x - (x++) ;
            Console.WriteLine(sml2);
            Console.WriteLine(x);
        }
    }
}

输出:

0
4
c# visual-studio-2019 operator-precedence postfix-operator prefix-operator
1个回答
0
投票

来自Operators

表达式中的操作数从左到右计算。例如,在F(i) + G(i++) * H(i)中,使用F的旧值调用方法i,然后使用G的旧值调用方法i,最后,使用H调用方法i ++x - x++的新值。这与运算符优先级是分开的,并且与之无关。

将其应用于表达式++x,我们可以看到首先计算x++,然后计算++ x - x ++,然后计算减法。

关于运算符优先级的一种好方法是,优先级较高的运算符更紧密地绑定比优先级较低的运算符。

例如,在表达式++x中,运算符-的绑定比x++更加紧密,而-运算符的绑定比(++x) - (x++)更加紧密,因此将其解析为[C0 ]。如果-运算符的优先级高于++xx++运算符,则此表达式将被解析为++(x - x)++(这没有多大意义)。

++x的优先级高于x++的事实在这里无关紧要。对表达式++x++而言很重要,该表达式被解析为(++x)++(并且由于不能将运算符x++应用于表达式(++ x)`,因此会引起编译器错误)。 >

© www.soinside.com 2019 - 2024. All rights reserved.