c# – 运算符优先级

2019-08-04 00:00:00 优先级 运算符

考虑一下这个C#类:

class Node
{
    public Node Next;
}

并考虑这两种情况:

        Node A = new Node();
        Node B = A;
        B=(B.Next = new Node());

        Node A = new Node();
        Node B = A;
        B.Next = (B=new Node());

为什么他们会产生相同的结果!?

(A) – >(B) – >空

我认为第二种情况会产生一个指向自身的节点,因为运算符优先…

Java和Python也是如此吗?
谢谢

最佳答案 此行为不是运算符优先级的结果,而是Java,Python和C#中定义表达式求值顺序的规则的结果.具体来说,在Java,Python和C#中,表达式从左到右进行计算.但事实并非如此,例如,在C和C中,您编写的结果将是未定义的.

您可能熟悉这个C拼图:

int i = 1;
printf("%d, %d\n", i++, ++i); // what is printed?

在C中,结果未定义.它可能是1,3,它可能是2,2,甚至是其他东西.在Java C#和Python中,结果总是1,3(当然除了Python没有pre-orfix操作符).

运算符优先级是一个单独的问题.它定义了解析树,而不是评估顺序.

假设您使用二进制中缀运算符op1和op2的新语言.并说你有以下代码:

e1 op1 e2 op2 e3

运算符优先级告诉您这是否意味着

((e1 op1 e2) op2 e3)

或者是否意味着

(e1 op1 (e2 op2 e3))

它没有告诉您评估e1,e2和e3的顺序.

相关文章