【问题标题】:syntax "variable = variable = variable;" whats happening?语法“变量 = 变量 = 变量;”发生了什么?
【发布时间】:2012-06-03 13:54:28
【问题描述】:

好的,我正在阅读一些关于 RedBlackTrees 的代码。我注意到这一行“v1 = v2 = v3 = v4;”我理解类似“v1 += v2”(将 v2 添加到 v1 的当前值)和“v1 = v2”(创建从 v2 到 v1 的引用)等内容。

public void insert( AnyType item )
{
    current = parent = grand = header;

但我很好奇内存/引用中发生了什么,current = parent = grand = header;

http://faculty.washington.edu/moishe/javademos/REDBlack/RedBTree.java

编辑:晚上 10:46

我仍然需要等待 10 分钟才能批准问题,对不起等待的女士们和先生们。

【问题讨论】:

  • 应该注意的是,该代码应该被视为概念证明或演示,但它绝对不是生产质量证明。例如current(和相关字段)应该是使用它们的方法中的局部变量。
  • 是的,我只是想知道发生了什么,所以我可以实施删除方法(哈哈),谢谢! :)

标签: java variables red-black-tree


【解决方案1】:

header 的参考值分配给 currentparentgrand。基本上所有的变量都指向同一个东西。

顺便说一句,这种做法在现实生活中的编程中经常不受欢迎。

考虑一下如果你有这样的代码会发生什么:

boolean flag = false;

if(flag = true) {
    System.out.println("true");
} else {
    System.out.println("false");
}

这里的输出将是true,因为这里真正发生的是分配,而不是比较

【讨论】:

  • 谢谢! :) .. 第一次看到这种引用。 :) +1 代表
  • 条件语句中的赋值与链式赋值有什么关系...?
  • @BoltClock 看了第一句,条件语句是关于变量赋值的概念。 (据我了解):)
【解决方案2】:

所有 4 个引用现在都具有相同的 header 值。

【讨论】:

  • 太棒了!谢谢 :) 我对发生的事情有点困惑。 +1 代表
【解决方案3】:

发生的情况是header 的值被分配给grand 的值,而parent 的值又被分配给current。最后,4 个变量保持相同的值;这个成语用于快速将多个变量初始化为相同的值,它等价于:

grand = header;
parent = grand;
current = parent;

赋值是从右到左进行的,实际上问题中的表达式是这样计算的:

current = (parent = (grand = header));

这是可行的,因为赋值运算符的结果实际上是评估分配的值,例如这可行:

return x = 42;

在最后一个 sn-p 中,42 被分配给 x,然后 x 的值被返回。

【讨论】:

    【解决方案4】:

    语句current = parent = grand = header 等价于:

    grand = header;
    parent = grand;
    current = parent;
    

    除非这些是原语类型,否则它们都将指向并共享与 header 相同的对象内存位置。

    【讨论】:

    • 感谢您抽出时间回答 +1 代表
    【解决方案5】:

    从右到左分配参考值,在原始类型中分配值。小例子:

    boolean first = true;
    boolean second = false;
    
    if (second = first) {
        ...
    }
    

    您将进入块if,因为值first 已分配给second,然后JVM 将检查是否second == true

    如果你写

    if (second == first) {
        ...
    }
    

    您不会进入if 块,因为second != first。那是不同的表达方式

    【讨论】:

    • 谢谢!花时间回答:) +1 代表
    【解决方案6】:

    = 运算符返回它刚刚分配的值并且是右关联的,所以

    a = b = c = d;
    

    等价于

    a = (b = (c = d));
    

    或到

    c = d;
    b = c;
    a = b;
    

    请注意,= 将值从右侧复制到左侧指定的位置。另请注意,“值”是指在 Object 派生类型的情况下对实例的引用,而不是实例本身。

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 2016-01-27
      • 1970-01-01
      • 2021-10-21
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 2016-10-04
      • 1970-01-01
      相关资源
      最近更新 更多