|
|
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Тут попался такой вопрос, не могу понять, как правильно прийти к правильному ответу. Какой будет результат выполнения данной части кода? Код: java 1. 2. 3. Ответ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. Где ошибка в моей логике, что я интерпретирую неверно и каковы правильные рассуждения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 13:35:45 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
байткод посмотри наверн javap Test.class -verbose А вообще не поверишь за 8 лет на java ни разу такого кода не видел - а если б увидел - не стал бы ломать голову а переписал бы нафиг:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 13:41:04 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Не спорю, что руки надо обрывать за такой код, но это пример на понимание теории и просто поломать голову. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 13:43:02 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Старый боян который еще в сях надоел. Пора его в ФАК добавить. Вобщем сначала расчитывается ++a. Потом сложение 7 + 6 = 13 Потом к 7 (увеличенное а) добавляется 13 и получается 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 13:44:20 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
не читал рассуждения, но у меня 20 с первого прохода ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 13:45:14 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
maytonсначала расчитывается ++a. Потом сложение 7 + 6 = 13 Потом к 7 (увеличенное а) добавляется 13 и получается 20. Почему 7+6 , а не 7+7? Ведь a уже увеличилось после ++a до 7. Нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 13:48:33 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
maytonСтарый боян который еще в сях надоел. Пора его в ФАК добавить. Вобщем сначала расчитывается ++a. Потом сложение 7 + 6 = 13 Потом к 7 (увеличенное а) добавляется 13 и получается 20. неверно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 13:49:24 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
grasoff.netне читал рассуждения, но у меня 20 с первого прохода ) я тему создал не чтобы проверят пользователей, в их компетентности я не сомневаюсь, потому спрашиваю, чтобы самому понять. Почему 20 получилось? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 13:50:02 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Exiartmaytonсначала расчитывается ++a. Потом сложение 7 + 6 = 13 Потом к 7 (увеличенное а) добавляется 13 и получается 20. Почему 7+6 , а не 7+7? Ведь a уже увеличилось после ++a до 7. Нет? Если складывать слева направо или справа налево? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 13:53:16 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
maytonExiartпропущено... Почему 7+6 , а не 7+7? Ведь a уже увеличилось после ++a до 7. Нет? Если складывать слева направо или справа налево? А как правильно? Окей, слева направа 7+7, а справо налево должно быть 8+6. Почему 7+6? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 13:56:35 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Exiart, видимо x += таки обертка над x = x +, потому если это всё представить в виде Код: java 1. становится ясно откуда 6 + 7 + 7 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 13:56:38 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
mayton, если так a += ++a + a , то тоже 20, а значит 7 (увеличенное а) не влияет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 13:56:49 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
mayton, А нет, извини, я не правильно понял, извиняюсь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 13:59:44 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
ЛагманExiart, видимо x += таки обертка над x = x +, потому если это всё представить в виде Код: java 1. становится ясно откуда 6 + 7 + 7 Почему эта обёртка работает сразу, ведь во всех книгах черным по белому написано, что op= , как и = имеют наименьший приоритет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:00:03 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
потому что это синтаксический сахар ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:01:50 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Давайте дизассемблить. В сях звучало - дескыть compiller depends или что-то в этом роде. Для Java, думаю поведение должно быть более стабильно. Весь вопрос в русле того, работаем ли мы с ret-value или с ref на переменную а. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:03:37 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
и (не знаю истоию операторов op=), следуя логике, если автор языка хочет внести сахар, заменяющий операции инкремента Код: java 1. , то должна обеспечиваться преемственность, наверное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:05:35 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
mayton, Ну ++a + a++ дает нам 14, потому что операция сложения является левоассоциативной и выполняется слева направа, т.е. 7+7. Но почему синтаксический сахар с +=? Вот у меня в голове срыв шаблона, потому и обратился на форум. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:07:51 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Exiart, jad пишет : a = a++ +(a + a++); Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:09:07 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Справа налево? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:11:07 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Короче походу дела задача сводится к проблеме следующего кода: Код: java 1. 2. 3. если идти по иерархии порядка вычислений, то вместо a++ будет 6, но a станет 7. Потом 7+6=13. а если "синтаксический сахар", то выражение можно обозначить как a=a+ a++; и ответ будет 14. java выдает 14. Обидно, что есть такой "синтаксический сахар" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:14:44 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:16:23 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:19:11 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Exiart, Зато консистентно, если вдруг ты решишь заменить Код: java 1. на Код: java 1. , значение не изменится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:20:40 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Лагман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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:22:14 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37983628&tid=2130841]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
71ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 284ms |
| total: | 470ms |

| 0 / 0 |
