powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Порядок вычисления
25 сообщений из 110, страница 4 из 5
Порядок вычисления
    #38824300
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovТочнее, не понимаю почему при ассоциативности справа-налево, вычисления идут слева-направо.
Я уже выше писал - ассоциативность и приоритет влияют только на фазу синтаксического анализа.
А вычисления происходят позже и их порядок никакого отношения к этому не имеет.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824303
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЯ уже выше писал - ассоциативность и приоритет влияют только на фазу синтаксического анализа.
А вычисления происходят позже и их порядок никакого отношения к этому не имеет.Вот это и составляет проблему.
Делая своё выпендрёжное выражение я полагался на правила приоритетов и ассоциативности. И считаю это вполне естественным.
Почему, внезапно, я должен делать отдельные поправки на отдельный порядок вычислений.

P.S. Не то, чтобы я был "реально недоволен", но хочется понять логику.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824305
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конкретно в данном случае синтаксическое дерево выглядит так (если рассматривать только присвоения):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
(=  
  "ar[++i]" 
  (= 
    "ar[i]" 
    "++i"
  ) 
)


Вот интерпретатор обходит дерево вглубь и вычисляет аргументы каждого узла слева-направо.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824308
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovДелая своё выпендрёжное выражение я полагался на правила приоритетов и ассоциативности. И считаю это вполне естественным.
Не знаю. Я не считаю это естественным.
Вероятно у многих нечеткое описание приоритетов операций в некоторых книгах создает впечатление что речь про порядок вычислений. У меня такой иллюзии никогда не было. Но я и книг по программированию почти не читал :)
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824310
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВот интерпретатор обходит дерево вглубь и вычисляет аргументы каждого узла слева-направо.
Кстати, этот порядок соответствует визуальному порядку этих операций в коде, поэтому именно его я вначале топика и предлагал зафиксировать при устранении UB в C++.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824311
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyКонкретно в данном случае синтаксическое дерево выглядит так (если рассматривать только присвоенияЯ готов согласится с вашим примером для "пользовательских" типов. Но только потому, что для пользовательских типов операторы подменяются на вызовы функций.
Встроенные операторы, собственно, для того и существуют, чтобы порядок их вычисления определялся правилами. В том числе - правилом ассоциативности.

P.S. Теперь я понимаю пример mayton, но каким надо быть садистом, чтобы пересталять некоммутирующие операции?...
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824312
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Операции тут не переставляются. Просто операнды вычисляются не в том порядке как вы думали :)
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824315
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyОперации тут не переставляются. Просто операнды вычисляются не в том порядке как вы думали :)Ну нельзя переставлять порядок вычислений для некоммутирующих операций. Нельзя.
Или пометить четким "неопределённое поведение" или следовать правилам. В том числе - правилу ассоциативности.
Ассоциативность права-налево - делаем вычисления справа-налево.
Хотим потенциальную оптимизацию для вычислений супротив ассоциативности? Вешаем табличку "неопределённое поведение".
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824321
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз. В последний.
"порядок вычислений для некоммутирующих операций" тут не менялся.
Операции вычисляются именно в порядке приоритетов.
Т.е. в конструкции a = b = c сначала вычисляется c, потом b, потом a - всегда.
Но поскольку a, b, c это в свою очередь тоже операции, то сами они вычисляются в произвольное удобное время (обычно - как только вычислены их соответствующие операнды).
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824323
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyТ.е. в конструкции a = b = c сначала вычисляется c, потом b, потом a - всегда.
Упс, я не это имел в виду.
Тут заменить на такую фразу:
Т.е. в конструкции a = b = c сначала вычисляется b = c, потом a = .. - всегда.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824326
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyТут заменить на такую фразу:
Т.е. в конструкции a = b = c сначала вычисляется b = c, потом a = .. - всегда.И что?
Как это меняет тот факт, что для встроенного правоассоциативного оператора ОП цепочка:
Код: sql
1.
a ОП b ОП c;

должна вычисляться не так, как разработчику компилятора удобно строить AST, а строго в порядке "c, затем b, затем a"?
Почему, указав:
Код: sql
1.
a * b / c;

я должен закладываться на то, что кому-то покажется оптимальней, типа эквивалентный, вариант:
Код: sql
1.
b / c * a

?
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824330
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять не поняли.
Ладно еще пример, совсем простой.

Код: plaintext
1.
a[1 + 2] = 3 + 4;


Вот в этом примере, я обязательно сначала должен вычислить 3+4?
Или я все-таки могу не нарушая логику выражения сначала вычислить 1 + 2, потом 3 + 4, а потом выполнить присвоение a[3] = 7?
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824331
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyсначала вычислить 1 + 2, потом 3 + 4, а потом выполнить присвоение a[3] = 7
Ну вот признайтесь честно, вы ведь когда мысленно выполняете это выражение, вы именно в таком порядке вычисляете?
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824338
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНу вот признайтесь честно, вы ведь когда мысленно выполняете это выражение, вы именно в таком порядке вычисляете? Если нет других ограничений - да.
Но давайте рассмотрим "a * b / c".
Если сделать корявый, но простой парсер, то в стек префиксной машины может попасть сначала "* a, " и потом "/ b, c".
Извлекаем с вершины "/ b, c", cчитаем некий x, помещаем его в стек и теперь можно посчитать "* a, x".
Против школьной математики мы не погрешили.
Проблема в том, что на множестве дискретных и ограниченных целых чисел есть два эффекта, которых нет на сплошном и бесконечном множестве вещественных - переполнение и потеря точности.
В результате ассоциативность становится не просто "фигнёй из учебников по программированию", а существенным элементом языка.
На а то, что русскому естественно, арабу - ересь
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824340
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovЕсли сделать корявый, но простой парсер, то в стек префиксной машины может попасть сначала "* a, " и потом "/ b, c".
Ничего подобного в вашем примере с присвоениями не происходит.
Думаю завтра вы на свежую голову сами увидите это :)
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824341
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНичего подобного в вашем примере с присвоениями не происходит.
Думаю завтра вы на свежую голову сами увидите это :)В моём примере порядок вычисления меняется с "ассоциативного" на "допустимый по правилу коммутативности":
Код: sql
1.
return (100 * 1 / 3) == (1 / 3 * 100)
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824343
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНичего подобного в вашем примере с присвоениями не происходит.
Думаю завтра вы на свежую голову сами увидите это :)Упростим до:
Код: sql
1.
выр1 ОП выр2

В каком порядке считать выражения, являющиеся операндами оператора:
1. Как удобнее;
2. В соответствии с ассоциативностью оператора;
3. Слева-направо, т.к. именно в этом направлении двигаются глаза программиста.
Пункт первый - UB, но исключает нытьё после переопределения оператора.
Пункт второй понятен, но требует вспоминать эти самые правила ассоциативности. Напрягает прогрессивную общественность
Пункт третий тоже понятен. Американцам и русским. У арабов и евреев может быть другое мнение
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824408
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, Булгаков прекрасен, спасибо :)
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824555
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Топик почему-то вдохновил на повторное чтение замечательной статьи
http://www.interstron.ru/upload/images/pubs/Redkaya_professiya.pdf

Вобщем это невероятно творческий процесс. Создание компиллятора С++.
Вобщем у меня есть мысль что рассматривать построение любого компилера
как конвейер стандартных "школьных" шагов типа построения грамматик e.t.c.
- это сильное-сильное упрощение.

Современный компиллятор С++ это в некотором роде... магия. И талант
людей его создающих.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824751
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Java. Пока проигрываем. Компиллятор не выдал предупреждений.

Код: java
1.
2.
3.
4.
5.
6.
 public static void main(String[] args){
        int[] v = {0, 0};
        int i = 0;
        v[i++] = i++;
        System.out.printf("%d %d",v[0],v[1]);
    }



1 0
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824782
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FindBug тоже молчит.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824984
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Предупреждений в джаве нет, т.к. поведение такого кода описано в спеках языка и этот код соответственно совершенно легальный.

То что вы не понимаете почему именно такой результат получается, не говорит о недостатке языка, а только о вашей недоработке в изучении языка :)
...
Рейтинг: 0 / 0
Порядок вычисления
    #38824991
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я уже писал что я думаю об автоматизации подобной проверки.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38825004
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.

Видите, никаких ссылок на ассоциативность и приоритет операций.

И это нормальное правило, которое следовало бы ввести в С/С++.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38825064
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovMasterZivв Java поведение подобного кода будет четко определено.И вы можете подтвердить своё высказывание ссылкой на JLS???

Да.
...
Рейтинг: 0 / 0
25 сообщений из 110, страница 4 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / Порядок вычисления
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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