powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Задача на приоритет операций
34 сообщений из 34, показаны все 2 страниц
Задача на приоритет операций
    #37983494
Exiart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут попался такой вопрос, не могу понять, как правильно прийти к правильному ответу.
Какой будет результат выполнения данной части кода?
Код: java
1.
2.
3.
int a = 6;
a += ++a + a++; 
System.out.println(a);


Ответ20


Мои рассуждения:
Высший приоритет имеют операции инкремента, потому они и выполняются в первую очередь:
1) ++a: сначала a повысится до 7 и результат операции станет 7
2) a++: a после выполнения первого пункта уже 7, потому результат этой части станет 7, а a затем повысится до 8;
Получаем промежуточное выражение: a+= 7 + 7; при этом после пункта 2 равен a=8 ;
Следующая по приоритетности идёт операция сложения:
3) 7 + 7: результат операции станет 14.
И в последнюю очередь идет операция op= , т.е. += :
4) a+=14; -> a=a+14;
Но тут стоит вспомнить, что после пункта 2 a=8 , т.е. a=8+14=22; Т.е. ответ получается 22.

Где ошибка в моей логике, что я интерпретирую неверно и каковы правильные рассуждения?
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983509
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
байткод посмотри наверн javap Test.class -verbose

А вообще не поверишь за 8 лет на java ни разу такого кода не видел - а если б увидел - не стал бы ломать голову а переписал бы нафиг:)
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983514
Exiart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не спорю, что руки надо обрывать за такой код, но это пример на понимание теории и просто поломать голову.
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983516
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый боян который еще в сях надоел. Пора его в ФАК добавить.

Вобщем

сначала расчитывается ++a. Потом сложение 7 + 6 = 13
Потом к 7 (увеличенное а) добавляется 13 и получается 20.
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983517
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не читал рассуждения, но у меня 20 с первого прохода )
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983529
Exiart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonсначала расчитывается ++a. Потом сложение 7 + 6 = 13
Потом к 7 (увеличенное а) добавляется 13 и получается 20.

Почему 7+6 , а не 7+7? Ведь a уже увеличилось после ++a до 7. Нет?
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983533
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСтарый боян который еще в сях надоел. Пора его в ФАК добавить.

Вобщем

сначала расчитывается ++a. Потом сложение 7 + 6 = 13
Потом к 7 (увеличенное а) добавляется 13 и получается 20.

неверно
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983534
Exiart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grasoff.netне читал рассуждения, но у меня 20 с первого прохода )

я тему создал не чтобы проверят пользователей, в их компетентности я не сомневаюсь, потому спрашиваю, чтобы самому понять. Почему 20 получилось?
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983542
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Exiartmaytonсначала расчитывается ++a. Потом сложение 7 + 6 = 13
Потом к 7 (увеличенное а) добавляется 13 и получается 20.

Почему 7+6 , а не 7+7? Ведь a уже увеличилось после ++a до 7. Нет?
Если складывать слева направо или справа налево?
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983549
Exiart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonExiartпропущено...


Почему 7+6 , а не 7+7? Ведь a уже увеличилось после ++a до 7. Нет?
Если складывать слева направо или справа налево?

А как правильно? Окей, слева направа 7+7, а справо налево должно быть 8+6. Почему 7+6?
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983551
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Exiart,

видимо x += таки обертка над x = x +, потому если это всё представить в виде
Код: java
1.
a = a + ++a + a++



становится ясно откуда 6 + 7 + 7
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983552
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

если так a += ++a + a , то тоже 20, а значит 7 (увеличенное а) не влияет
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983561
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

А нет, извини, я не правильно понял, извиняюсь
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983562
Exiart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЛагманExiart,

видимо x += таки обертка над x = x +, потому если это всё представить в виде
Код: java
1.
a = a + ++a + a++



становится ясно откуда 6 + 7 + 7

Почему эта обёртка работает сразу, ведь во всех книгах черным по белому написано, что op= , как и = имеют наименьший приоритет?
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983570
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому что это синтаксический сахар
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983575
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте дизассемблить. В сях звучало - дескыть compiller depends или что-то в этом роде.
Для Java, думаю поведение должно быть более стабильно. Весь вопрос в русле того,
работаем ли мы с ret-value или с ref на переменную а.
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983581
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и (не знаю истоию операторов op=), следуя логике, если автор языка хочет внести сахар, заменяющий операции инкремента
Код: java
1.
a = a + ...

, то должна обеспечиваться преемственность, наверное.
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983592
Exiart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

Ну ++a + a++ дает нам 14, потому что операция сложения является левоассоциативной и выполняется слева направа, т.е. 7+7. Но почему синтаксический сахар с +=? Вот у меня в голове срыв шаблона, потому и обратился на форум.
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983600
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Exiart,

jad пишет : a = a++ +(a + a++);

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 0: bipush        6
       2: istore_1      
       3: iload_1       
       4: iinc          1, 1
       7: iload_1       
       8: iload_1       
       9: iinc          1, 1
      12: iadd          
      13: iadd          
      14: istore_1      
      15: getstatic     #19                 // Field java/lang/System.out:Ljava/io/PrintStream;
      18: iload_1       
      19: invokevirtual #25                 // Method java/io/PrintStream.println:(I)V
      22: return        
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983605
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Справа налево?
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983616
Exiart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Короче походу дела задача сводится к проблеме следующего кода:
Код: java
1.
2.
3.
int a = 6;
a += a++;
System.out.println(a);



если идти по иерархии порядка вычислений, то вместо a++ будет 6, но a станет 7. Потом 7+6=13.
а если "синтаксический сахар", то выражение можно обозначить как a=a+ a++; и ответ будет 14.
java выдает 14.
Обидно, что есть такой "синтаксический сахар"
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983620
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FD, не так.

iload_1 -> загрузить a в стек (в стеке 6)
iinc -> инкремент (a = 7)
iload_1 -> загрузить a в стек (в стеке 6, 7)
iload_1 -> загрузить a в стек (в стеке 6, 7, 7)
iinc -> инкремент (a = 8)
iadd -> в стеке 6, 14
iadd -> в стеке 20
istore_1 -> a = 20
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983628
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

все-таки ты не прав, вот грамматика
additiveExpression
: multiplicativeExpression ( ('+' | '-') multiplicativeExpression )*
;

multiplicativeExpression
: unaryExpression ( ( '*' | '/' | '%' ) unaryExpression )*
;

unaryExpression
: '+' unaryExpression
| '-' unaryExpression
| '++' unaryExpression
| '--' unaryExpression
| unaryExpressionNotPlusMinus
;

unaryExpressionNotPlusMinus
: '~' unaryExpression
| '!' unaryExpression
| castExpression
| primary selector* ('++'|'--')?
;

те

a=a+((++a)+(a++)) 6+7+7
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983634
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Exiart,

Зато консистентно, если вдруг ты решишь заменить
Код: java
1.
 a=a+ a++

на
Код: java
1.
a+=a++

, значение не изменится.
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983643
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лагман0FD, не так.

iload_1 -> загрузить a в стек (в стеке 6)
iinc -> инкремент (a = 7) --- (в стеке 7)
iload_1 -> загрузить a в стек (в стеке 6, 7) ---(в стеке 7,6)
iload_1 -> загрузить a в стек (в стеке 6, 7, 7) ---(в стеке 7,6,6)
iinc -> инкремент (a = 8) ---(в стеке 7,6,7)
iadd -> в стеке 6, 14
iadd -> в стеке 20
istore_1 -> a = 20
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983645
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вернёмся к началу. Выражение a+=a имеет мало смысла. Имеет мало смысла и пред-пост инкременты
переменной в одном выражении. Я такого никогда не юзал.

И ничего "обидного" нет т.к. сахарной ваты можно всегда придумать много
и ломать себе голову потом. В продакшен коде надо за такое взЪебсти хорошенько и крепить на бабло.
Чтобы не было рецидивов. А кто хочет ломать себе мозк - может поизучать Malbolge в свободное от работы
время. Там обсуждений хватит на отдельный подфорум.
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983659
Exiart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лагман,

Как бы да, меня просто смутило, что сейчас перечитываю книги по джаве, а везде (и в инетах в том числе) приведена одна и та же таблица приоритета операция, и что всякие +=, -=, и подобное имеет наименьший приоритет.
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983661
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FD,

но ведь iinc увеличивает переменную а не то что в стеке.
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983662
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лагман,

ту что в стеке
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983678
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FDЛагман,

ту что в стеке

дурило я картонное, increment local variable #index by signed byte const
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983864
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Exiart,

Проще обернуть каждую операцию инкремента в скобки
Код: java
1.
a += (a + 1) + ((a) + 1);
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983872
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заметьте. И всё это для того чтобы подавить эффект инкрементов. Сделать их
более детерминированными с точки зрения синтаксиса, и времени что-ли.
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37983953
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСделать их более детерминированными с точки зрения синтаксиса +1

Reasoning: Compounding increment or decrement operators into
method calls or math is not clear to less experienced programmers
who may be required to modify your code.
...
Рейтинг: 0 / 0
Задача на приоритет операций
    #37984033
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ExiartГде ошибка в моей логике, что я интерпретирую неверно и каковы правильные рассуждения?А можно параграф из JLS, который гарантирует порядок вычисления операндов оператора?
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Задача на приоритет операций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]