考虑一下这个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的顺序.