|
|
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Вернёмся к началу. Выражение a+=a имеет мало смысла. Имеет мало смысла и пред-пост инкременты переменной в одном выражении. Я такого никогда не юзал. И ничего "обидного" нет т.к. сахарной ваты можно всегда придумать много и ломать себе голову потом. В продакшен коде надо за такое взЪебсти хорошенько и крепить на бабло. Чтобы не было рецидивов. А кто хочет ломать себе мозк - может поизучать Malbolge в свободное от работы время. Там обсуждений хватит на отдельный подфорум. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:22:27 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Лагман, Как бы да, меня просто смутило, что сейчас перечитываю книги по джаве, а везде (и в инетах в том числе) приведена одна и та же таблица приоритета операция, и что всякие +=, -=, и подобное имеет наименьший приоритет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:25:06 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
0FD, но ведь iinc увеличивает переменную а не то что в стеке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:25:19 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Лагман, ту что в стеке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:25:49 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
0FDЛагман, ту что в стеке дурило я картонное, increment local variable #index by signed byte const ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 14:31:00 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Exiart, Проще обернуть каждую операцию инкремента в скобки Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 15:23:34 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
Заметьте. И всё это для того чтобы подавить эффект инкрементов. Сделать их более детерминированными с точки зрения синтаксиса, и времени что-ли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 15:26:23 |
|
||
|
Задача на приоритет операций
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2012, 15:55:02 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2130841]: |
0ms |
get settings: |
19ms |
get forum list: |
16ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
54ms |
get topic data: |
17ms |
get forum data: |
5ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 301ms |
| total: | 486ms |

| 0 / 0 |
