【问题标题】:Postfix has high precedence than prefix so value of sml2 in given code should be 2 but it's 0. Why?后缀的优先级高于前缀,因此给定代码中 sml2 的值应该是 2 但它是 0。为什么?
【发布时间】:2020-07-27 01:57:13
【问题描述】:
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】:
来自Operators:
表达式中的操作数从左到右计算。例如,在F(i) + G(i++) * H(i)中,使用i的旧值调用方法F,然后使用i的旧值调用方法G,最后使用H调用方法i 的新值。这与运算符优先级分开且无关。
将此应用于您的表达式++x - x++,我们可以看到首先评估++x,然后评估x++,然后评估减法。
考虑运算符优先级的一个好方法是,具有较高优先级的运算符比具有较低优先级的运算符绑定得更紧密。它用于计算应将字符序列解析为哪些表达式,而不是计算事物的顺序。
例如,在表达式++ x - x ++ 中,运算符++x 比- 运算符绑定得更紧密,x++ 运算符比- 运算符绑定得更紧密,所以解析为@ 987654337@。如果- 运算符的优先级高于++x 或x++ 运算符,则此表达式将被解析为++(x - x)++(这没有多大意义)。
++x 的优先级高于x++ 的事实在这里并不重要。 确实表达式 ++x++ 很重要,它被解析为 (++x)++ 而不是 ++(x++)(并引发编译器错误,因为运算符 x++ 不能应用于表达式 @ 987654348@)。
一旦您使用运算符优先级规则确定++ x - x ++ 应该被解析为(++x) - (x++),则上面引用的规则适用,并且- 表达式的操作数从左到右计算.