考虑这个 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 没有前缀或后缀++ 运算符除外)。
运算符优先级是一个单独的问题。它定义了解析树,而不是求值顺序。
假设您有一种新语言,其中包含二进制中缀运算符 op1
和 op2
。并假设您有以下代码:
e1 op1 e2 op2 e3
运算符优先级告诉你这是否意味着
((e1 op1 e2) op2 e3)
或者是什么意思
(e1 op1 (e2 op2 e3))
它不会告诉您 e1
、e2
和 e3
的计算顺序。
关于c# - 运算符优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5178984/