Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovТочнее, не понимаю почему при ассоциативности справа-налево, вычисления идут слева-направо. Я уже выше писал - ассоциативность и приоритет влияют только на фазу синтаксического анализа. А вычисления происходят позже и их порядок никакого отношения к этому не имеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 23:59 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЯ уже выше писал - ассоциативность и приоритет влияют только на фазу синтаксического анализа. А вычисления происходят позже и их порядок никакого отношения к этому не имеет.Вот это и составляет проблему. Делая своё выпендрёжное выражение я полагался на правила приоритетов и ассоциативности. И считаю это вполне естественным. Почему, внезапно, я должен делать отдельные поправки на отдельный порядок вычислений. P.S. Не то, чтобы я был "реально недоволен", но хочется понять логику. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 00:04 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Конкретно в данном случае синтаксическое дерево выглядит так (если рассматривать только присвоения): Код: plaintext 1. 2. 3. 4. 5. 6. 7. Вот интерпретатор обходит дерево вглубь и вычисляет аргументы каждого узла слева-направо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 00:09 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovДелая своё выпендрёжное выражение я полагался на правила приоритетов и ассоциативности. И считаю это вполне естественным. Не знаю. Я не считаю это естественным. Вероятно у многих нечеткое описание приоритетов операций в некоторых книгах создает впечатление что речь про порядок вычислений. У меня такой иллюзии никогда не было. Но я и книг по программированию почти не читал :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 00:14 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВот интерпретатор обходит дерево вглубь и вычисляет аргументы каждого узла слева-направо. Кстати, этот порядок соответствует визуальному порядку этих операций в коде, поэтому именно его я вначале топика и предлагал зафиксировать при устранении UB в C++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 00:17 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyКонкретно в данном случае синтаксическое дерево выглядит так (если рассматривать только присвоенияЯ готов согласится с вашим примером для "пользовательских" типов. Но только потому, что для пользовательских типов операторы подменяются на вызовы функций. Встроенные операторы, собственно, для того и существуют, чтобы порядок их вычисления определялся правилами. В том числе - правилом ассоциативности. P.S. Теперь я понимаю пример mayton, но каким надо быть садистом, чтобы пересталять некоммутирующие операции?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 00:18 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Операции тут не переставляются. Просто операнды вычисляются не в том порядке как вы думали :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 00:21 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyОперации тут не переставляются. Просто операнды вычисляются не в том порядке как вы думали :)Ну нельзя переставлять порядок вычислений для некоммутирующих операций. Нельзя. Или пометить четким "неопределённое поведение" или следовать правилам. В том числе - правилу ассоциативности. Ассоциативность права-налево - делаем вычисления справа-налево. Хотим потенциальную оптимизацию для вычислений супротив ассоциативности? Вешаем табличку "неопределённое поведение". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 00:30 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Еще раз. В последний. "порядок вычислений для некоммутирующих операций" тут не менялся. Операции вычисляются именно в порядке приоритетов. Т.е. в конструкции a = b = c сначала вычисляется c, потом b, потом a - всегда. Но поскольку a, b, c это в свою очередь тоже операции, то сами они вычисляются в произвольное удобное время (обычно - как только вычислены их соответствующие операнды). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 00:43 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyТ.е. в конструкции a = b = c сначала вычисляется c, потом b, потом a - всегда. Упс, я не это имел в виду. Тут заменить на такую фразу: Т.е. в конструкции a = b = c сначала вычисляется b = c, потом a = .. - всегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 00:45 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyТут заменить на такую фразу: Т.е. в конструкции a = b = c сначала вычисляется b = c, потом a = .. - всегда.И что? Как это меняет тот факт, что для встроенного правоассоциативного оператора ОП цепочка: Код: sql 1. должна вычисляться не так, как разработчику компилятора удобно строить AST, а строго в порядке "c, затем b, затем a"? Почему, указав: Код: sql 1. я должен закладываться на то, что кому-то покажется оптимальней, типа эквивалентный, вариант: Код: sql 1. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 00:55 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Опять не поняли. Ладно еще пример, совсем простой. Код: plaintext 1. Вот в этом примере, я обязательно сначала должен вычислить 3+4? Или я все-таки могу не нарушая логику выражения сначала вычислить 1 + 2, потом 3 + 4, а потом выполнить присвоение a[3] = 7? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 01:06 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyсначала вычислить 1 + 2, потом 3 + 4, а потом выполнить присвоение a[3] = 7 Ну вот признайтесь честно, вы ведь когда мысленно выполняете это выражение, вы именно в таком порядке вычисляете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 01:09 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyНу вот признайтесь честно, вы ведь когда мысленно выполняете это выражение, вы именно в таком порядке вычисляете? Если нет других ограничений - да. Но давайте рассмотрим "a * b / c". Если сделать корявый, но простой парсер, то в стек префиксной машины может попасть сначала "* a, " и потом "/ b, c". Извлекаем с вершины "/ b, c", cчитаем некий x, помещаем его в стек и теперь можно посчитать "* a, x". Против школьной математики мы не погрешили. Проблема в том, что на множестве дискретных и ограниченных целых чисел есть два эффекта, которых нет на сплошном и бесконечном множестве вещественных - переполнение и потеря точности. В результате ассоциативность становится не просто "фигнёй из учебников по программированию", а существенным элементом языка. На а то, что русскому естественно, арабу - ересь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 01:30 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovЕсли сделать корявый, но простой парсер, то в стек префиксной машины может попасть сначала "* a, " и потом "/ b, c". Ничего подобного в вашем примере с присвоениями не происходит. Думаю завтра вы на свежую голову сами увидите это :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 01:36 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyНичего подобного в вашем примере с присвоениями не происходит. Думаю завтра вы на свежую голову сами увидите это :)В моём примере порядок вычисления меняется с "ассоциативного" на "допустимый по правилу коммутативности": Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 01:45 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyНичего подобного в вашем примере с присвоениями не происходит. Думаю завтра вы на свежую голову сами увидите это :)Упростим до: Код: sql 1. В каком порядке считать выражения, являющиеся операндами оператора: 1. Как удобнее; 2. В соответствии с ассоциативностью оператора; 3. Слева-направо, т.к. именно в этом направлении двигаются глаза программиста. Пункт первый - UB, но исключает нытьё после переопределения оператора. Пункт второй понятен, но требует вспоминать эти самые правила ассоциативности. Напрягает прогрессивную общественность Пункт третий тоже понятен. Американцам и русским. У арабов и евреев может быть другое мнение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 01:54 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Булгаков прекрасен, спасибо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 06:33 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Топик почему-то вдохновил на повторное чтение замечательной статьи http://www.interstron.ru/upload/images/pubs/Redkaya_professiya.pdf Вобщем это невероятно творческий процесс. Создание компиллятора С++. Вобщем у меня есть мысль что рассматривать построение любого компилера как конвейер стандартных "школьных" шагов типа построения грамматик e.t.c. - это сильное-сильное упрощение. Современный компиллятор С++ это в некотором роде... магия. И талант людей его создающих. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 10:26 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Java. Пока проигрываем. Компиллятор не выдал предупреждений. Код: java 1. 2. 3. 4. 5. 6. 1 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 12:46 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
FindBug тоже молчит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 13:13 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
mayton, Предупреждений в джаве нет, т.к. поведение такого кода описано в спеках языка и этот код соответственно совершенно легальный. То что вы не понимаете почему именно такой результат получается, не говорит о недостатке языка, а только о вашей недоработке в изучении языка :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 15:08 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Я уже писал что я думаю об автоматизации подобной проверки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 15:09 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
mayton, проверка не всегда возможна, и что более важно, далеко не всем она нужна :) Там кто-то выше просил ссылку на спеку джавы JLS, section 15.7 The Java programming language guarantees that the operands of operators appear to be evaluated in a specific evaluation order, namely, from left to right. ... The left-hand operand of a binary operator appears to be fully evaluated before any part of the right-hand operand is evaluated. Видите, никаких ссылок на ассоциативность и приоритет операций. И это нормальное правило, которое следовало бы ввести в С/С++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 15:17 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovMasterZivв Java поведение подобного кода будет четко определено.И вы можете подтвердить своё высказывание ссылкой на JLS??? Да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 15:51 |
|
||
|
|

start [/forum/topic.php?fid=57&startmsg=38824300&tid=2018480]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 263ms |
| total: | 423ms |

| 0 / 0 |
