加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 运算符优先级

发布时间:2020-12-16 01:41:42 所属栏目:百科 来源:网络整理
导读:考虑一下这个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) – 空 我
考虑一下这个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,%dn",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的顺序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读