Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Задача на приоритет операций / 25 сообщений из 34, страница 1 из 2
04.10.2012, 13:35:45
    #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
04.10.2012, 13:41:04
    #37983509
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на приоритет операций
байткод посмотри наверн javap Test.class -verbose

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

Вобщем

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

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

Вобщем

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

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

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

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


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

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

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



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

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

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

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



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

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

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

Ну ++a + a++ дает нам 14, потому что операция сложения является левоассоциативной и выполняется слева направа, т.е. 7+7. Но почему синтаксический сахар с +=? Вот у меня в голове срыв шаблона, потому и обратился на форум.
...
Рейтинг: 0 / 0
04.10.2012, 14:09:07
    #37983600
0FD
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
04.10.2012, 14:11:07
    #37983605
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на приоритет операций
Справа налево?
...
Рейтинг: 0 / 0
04.10.2012, 14:14:44
    #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
04.10.2012, 14:16:23
    #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
04.10.2012, 14:19:11
    #37983628
0FD
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
04.10.2012, 14:20:40
    #37983634
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на приоритет операций
Exiart,

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

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

, значение не изменится.
...
Рейтинг: 0 / 0
04.10.2012, 14:22:14
    #37983643
0FD
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
Форумы / Java [игнор отключен] [закрыт для гостей] / Задача на приоритет операций / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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