c# - 运算符优先级

标签 c# java python operator-keyword operator-precedence

考虑这个 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)->空

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

JavaPython 中也是如此吗? 谢谢

最佳答案

此行为不是运算符优先级的结果,而是 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 没有前缀或后缀++ 运算符除外)。

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

假设您有一种新语言,其中包含二进制中缀运算符 op1op2。并假设您有以下代码:

e1 op1 e2 op2 e3

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

((e1 op1 e2) op2 e3)

或者是什么意思

(e1 op1 (e2 op2 e3))

不会告诉您 e1e2e3 的计算顺序。

关于c# - 运算符优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5178984/

相关文章:

java - 关闭随机 'PopUps'

python - MatPlotLib 中的 100% 堆叠条形图

java - 使用 Maven 构建 Geoserver 时出现 MojoExecutionException

python - wtforms+flask 今天的日期作为默认值

python - 标记语言而不是 HTML

c# - 维护和刷新二维绘图中的连接

c# - 在单个 ASP.NET Core 3.1 Web API 中管理两个 SPA;一个在根目录中,另一个在 "admin"路由中

c# - 将行尾保存到数据库

c# - Xamarin Mac 中的 AttributeName 使用什么

java - AnyLogic:提高网络模型的计算性能