2014-01-20 3 views
0

Я понимаю, как работает post-incrementing и pre-incrementing в Java, и я читал бесчисленные другие темы/вопросы от других людей по этой же теме. НО! Мне еще предстоит узнать, почему post-incrementing имеет более высокий приоритет, чем предварительный прирост в Java.ПОЧЕМУ УРОВЕНЬ ПОСЛЕДОВАТЕЛЬНОСТИ имеют более высокий приоритет, чем предварительное приращение в Java?

Кто-нибудь знает?

Насколько я знаю, пост-инкрементирование с более высоким или более низким приоритетом, чем предварительное приращение, не повлияет на результаты ваших программ, так как нет других унарных операторов, которые могли бы помешать сообщению/пред-инкрементированию. Кроме того, ++ не является двоичным оператором, поэтому он не похож на препятствия +, -, *,/и%. Итак, поэтому .. ПОЧЕМУ? ПОЧЕМУ, что пост-инкрементирование имеет более высокий приоритет, чем предварительный прирост?

Я был бы очень рад, если бы кто-нибудь мог просветить меня! :)

EDIT: Вот один официальный сайт, который утверждает правила/уровни приоритета в Java: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

EDIT2: Для всех downvoting это для дубликата вопрос, пожалуйста, не. Это Java, а не C++ и т. Д. Я искал и не нашел дубликат в Java.

EDIT3: Мотивация такова: Java была сделана так, что пост-инкрементирование имеет более высокий приоритет, чем предварительный приращение, и я еще не видел никакого примера, где результат отличается в зависимости от этих правил. Поэтому я не понимаю, почему post/pre-incrementing не имеют одинакового уровня приоритета.

+0

У вас есть какой-либо код, который, по вашему мнению, доказывает, что у него более высокий приоритет над другим? –

+0

Либо принять приоритет от C, либо пойти спросить Джеймса Гослинга или Денниса Ричи. Обычно спрашивают люди, которые хотят делать отвратительные вещи и предлагают примеры кода, которые ни один разумный человек никогда не напишет. Я вижу, что он на самом деле восходит к B, предшественнику C. – duffymo

+0

@Rohit Jain Вот доказательство того, что пост-инкрементирование действительно имеет более высокий приоритет, чем предварительный инкремент в Java (со ссылкой на 1-й и 2-й уровни в этой таблице) http: //docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html – Mistylaneous

ответ

1

Вам нужно спросить дизайнеров Java, чтобы узнать, почему они сделали этот вызов дизайна.

Но я ожидаю, что это просто для согласованности с C и C++.

Смотрите также:

Для записи важно, чтобы префиксные и постфиксные операторы имели различный приоритет. Если у них был такой же приоритет, то что-то вроде ++a++ имеет два альтернативных анализа ... и два альтернативных значения.


Ниже приведен пример, когда оператор старшинства бы наблюдаемую разницу:

public static volatile a = 42; 

public void busywork() { 
    while (true) { 
     ++aa--; // ... assuming this was valid Java code .... 
    } 
} 

Теперь создать 2 потока, один для вызова busywork, а второй для выборки значений из a. Вы должны иметь возможность наблюдать разные наборы значений для a, в зависимости от относительного приоритета оператора; то есть {41, 42} с действующими правилами. Если приоритет был одинаковым для пост и предварительного приращения и уменьшения, то это было бы компилятор специфический ли вы видели {41, 42} или {42, 43}.

(И, конечно, наличие двух правильных деревьев синтаксического анализа сделает жизнь более сложной для спецификации компилятора и для разработчиков компилятора.)

+0

'++ a ++' имеет два разбора, возможно, но оба имеют одинаковое значение: синтаксическая ошибка. Причина: в Java операторы \ crement оценивают значение 'rvalue', в отличие от C. Обоснование для различного приоритета все еще существует (уникальность ошибки синтаксического анализа), но это имеет значение только для синтаксического анализатора. –

+0

@MarkoTopolnik - Согласовано. Но я (возможно, лениво) говорил об общей проблеме приоритета pre/postfix, а не о специфическом характере проблемы Java. Другое дело, что в Java-случае (гипотетическая) семантическая разница может быть ненаблюдаемой, если 'a' не объявлен как« volatile ». –

+0

Несомненно, я копаю, что именно этот OP позже добавил еще две заметки, пытаясь подчеркнуть, что он знает о стороне C и задает конкретно специальный случай Java. –

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