2016-08-25 7 views
6

Я просто наткнулся на кусок кода, я нахожу интересным (потому что я никогда не видел его как вопрос прежде, чем в 2-х лет программирования)Java порядок старшинства

int x = 5; 
int y = 3; 
int z = y + (y+=1) % 4 + (x-=2)/3; 
System.out.println(z); 

Выход 4.

Мне интересно, почему левая часть 'y' сначала оценивается вместо '(y + = 1)', которая затем привела бы к результату 5. (другими словами, почему скобка не вынуждает порядок приоритета?)

Я не уверен, что искать, так как поиск «java order of Priorence» возвращает результаты tha t в лучшем случае показывает сложные примеры y ++, ++ y вроде вопросов или просто порядок таблицы приоритетов.

Я пометил Java, но я тестировал это с помощью C# и javascript, поэтому это, вероятно, общее в программировании.

Update

я ошиблась о порядке старшинства и порядка оценки.

Этот article помог мне лучше понять ответы.

+3

Что странно в оценке самого левого срока? –

+4

Вы не увидели бы это как вопрос, потому что любой программист, достойный его соли, не напишет что-то подобное. Эти вопросы совершенно бесполезны. – Kayaman

+1

@JFMeier Я хотел бы знать, почему скобка '(y + = 1)' не была выполнена первой. – Stein121

ответ

11

Вкратце, круглые скобки применяются только к определенному термину.

Выражение y + (y+=1) % 4 + (x-=2)/3; можно переписать в виде t1 + t2 + t3, с t1 стоя на y, t2 для (y+=1) % 4 и t3 для (x-=2)/3.

Java всегда оценивает это слева направо, так как ассоциативности бинарного оператора + находится слева направо. Следовательно, t1 является первым термином, который должен быть оценен, и поэтому делается так, что не указано значение значение y.

+1

Это ключ - оценка всегда LTR. Я считаю, что в C++ оценочный порядок _undefined _... –

+0

Действительно, оценка '+' от LTR: я добавил это. Обратите внимание, что тернарные условные выражения, например, оцениваются из RTL. – Bathsheba

+1

Это порядок, на котором говорят самые западные языки слева направо. Арабский, иврит читаются слева направо сравнением. –

Смежные вопросы