2012-05-29 3 views
2

Хорошо, поэтому я читаю код о RedBlackTrees. И я заметил эту строку «v1 = v2 = v3 = v4;» и я понимаю, что-то вроде «v1 + v2 =» (добавить v2 к текущему значению v1) и «v1 = v2» (создать ссылку от v2 к v1) и т.д.синтаксис "variable = variable = variable;" что происходит?

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

Но мне очень интересно к тому, что происходит в памяти/ссылках с current = parent = grand = header;

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

Edit: 10:46 вечера

я все равно придется ждать 10 минут, чтобы утвердить вопросы, извините за ожидание дам и джентльменов.

+1

Следует отметить, что этот код следует рассматривать как доказательство концепции или демонстрации, но это явно не доказательство качества продукции. Например, 'current' (и связанные поля) должны действительно быть локальными переменными в методах, которые их используют. –

+0

Да, я просто опускаю голову, что происходит, поэтому я могу реализовать метод удаления (ха-ха), спасибо! :) – Killrawr

ответ

2

То, что происходит в том, что значение header присваивается значение grand который присваивается значение parent, который в своей очереди получает присвоенный current. В конце 4 переменные имеют одинаковое значение; эта идиома используется, чтобы быстро инициализировать несколько переменных, к тому же значению, и это эквивалентно следующему:

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

Назначение происходит справа налево, на самом деле выражение в вопросе оценивается следующим образом:

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

Это работает, потому что результат оператора присваивания фактически оценивает к заданному значению, например, это работает:

return x = 42; 

В последнем фрагменте 42 присваивается x, после чего возвращается значение x.

+0

Спасибо! +1 rep :) – Killrawr

3

Исходное значение header присваивается каждому из current, parent и grand. В основном все переменные будут ссылаться на одно и то же.

Кстати, эта практика часто нахмурилась в реальном программировании.

Подумайте, что произойдет, если у вас такой код:

boolean flag = false; 

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

Выход будет true здесь как то, что происходит на самом деле здесь является назначение, а не сравнение.

+0

Спасибо! :) .. впервые посмотрев этот вид ссылки. :) +1 rep – Killrawr

+0

Что назначает в условных выражениях привязку к цепочкам ...? – BoltClock

+1

@BoltClock читает первое предложение, условное утверждение относится к понятию присвоений переменных. (из моего понимания) :) – Killrawr

2

Все 4 ссылки теперь имеют одинаковое значение заголовка.

+0

Brillant! спасибо :) Я был немного смущен тем, что происходило. +1 rep – Killrawr

1

Заявление current = parent = grand = header эквивалентен:

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

Если это не примитивы типа, все они будут указывать на и обмен же расположение объекта памяти, как и header.

+0

Спасибо, что нашли время ответить +1 rep – Killrawr

1

присвоены значения, назначенные справа налево, в значениях примитивных типов.Небольшой пример:

boolean first = true; 
boolean second = false; 

if (second = first) { 
    ... 
} 

вы отправитесь в блок if, поскольку значение first присваивается second, а затем JVM будет проверять second == true.

Если вы пишете

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

Вы не войдете if блок из-за second != first. Это разные выражения

+0

Спасибо! за время, чтобы ответить :) +1 rep – Killrawr

1

Оператор = возвращает значение, которое он только что назначенный и правильно ассоциативные, так

a = b = c = d; 

эквивалентно

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

или к

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

Обратите внимание, что = копирует значение справа в место, указанное левой стороной. Также обратите внимание, что «значение» означает ссылку на экземпляр в случае Object -независимых типов, а не самого экземпляра.

+0

Спасибо wormbo +1 – Killrawr