|
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
|
||||||
Order of evaluation02.07.2016, 00:37. Показов 3116. Ответов 35
Метки нет (Все метки)
Всем привет. Никак не могу побороть Order of evaluation. В статье на cppreference, приводятся примеры UB и уже на первом я застреваю и не понимаю почему именно так:
If a side effect on a scalar object is unsequenced relative to another side effect on the same scalar object, the behavior is undefined. Если побочный эффект для скалярного объекта не упорядочен по отношению к другому побочному эффекту для этого же объекта - поведение не определено
Собственно для примера выше пытался применить правила: 2) The value computations (but not the side-effects) of the operands to any operator are sequenced before the value computation of the result of the operator (but not its side-effects). ------------------------------------------------------------------------------------------- Вычисление значений (но не побочных эффектов) операндов любого оператора расположены перед вычислением значения оператора в целом (но не его побочного эффекта) 8) The side effect (modification of the left argument) of the built-in assignment operator and of all built-in compound assignment operators is sequenced after the value computation (but not the side effects) of both left and right arguments, and is sequenced before the value computation of the assignment expression (that is, before returning the reference to the modified object) ------------------------------------------------------------------------------------------- Побочный эффект (изменение левого аргумента) встроенного оператора присваивания и всех встроенных составных операторов присваивания расположены после вычисления значения (но не побочного эффекта) обоих аргументов (левого и правого) и расположены перед вычислением значения оператора присваивания (т.е. перед возвращением ссылки на измененный объект) Но не нашел противоречий. Помогите понять это. Возможно на примере других выражений.
0
|
||||||
| 02.07.2016, 00:37 | |
|
Ответы с готовыми решениями:
35
Логические операции и правило Short Circuit Evaluation HSQL запрос. Что не так? "from hiberdata.Order order where order.clientId=?" |
|
Неэпический
|
|||||
| 02.07.2016, 16:40 | |||||
Сообщение было отмечено ASCII как решение
Решениекомпилятор творить выполнять всякое разное, что, по его компетентному мнению, не приведет к изменению результата ![]() Правда, он еще вполне может выражения между собой местами менять, что может напакостить сильно, но это уже другая тема ![]() Добавлено через 1 минуту поэтому еще раз: i = i++ + 1, вы i меняете дважды, причем порядок изменений не определен.
0
|
|||||
|
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
|
|||||||
| 02.07.2016, 16:41 [ТС] | |||||||
|
В следствии чего:
http://en.cppreference.com/w/c... eval_order
0
|
|||||||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||
| 02.07.2016, 16:42 | ||
|
ASCII, забей на компилятор. У него вообще большая свобода действий (в разумных пределах конечно). В стандарте речь не о нем:
1
|
||
|
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
|
||||||||||||||
| 02.07.2016, 17:00 [ТС] | ||||||||||||||
|
Смотрите, имеем общее правило для вычисления операндов какого-либо оператора: 2) The value computations (but not the side-effects) of the operands to any operator are sequenced before the value computation of the result of the operator (but not its side-effects). То есть просто сказано, что сначала вычисляются операнды, а только потом результат всего оператора. Все. Далее у нас есть также и частный случай для операторов присвоения. 8) The side effect (modification of the left argument) of the built-in assignment operator and of all built-in compound assignment operators is sequenced after the value computation (but not the side effects) of both left and right arguments, and is sequenced before the value computation of the assignment expression (that is, before returning the reference to the modified object) Тут уже говорится несколько иначе. Первым делом вычисляются значения операндов оператора присваивания, то есть объект, которому присваивается и "результирующий объект", полученный после вычисления выражения, которое присваивается.
И УЖЕ ПОСЛЕ ЭТОГО, происходит финальный value computation. То есть тут получается все упорядочено оказывается? И это сбивает с толку. Ведь если следовать этим правилам (а другие правила тут не работают вроде-бы), то по моим умозаключениям получаем такую картину:
Поехали: Первый вариант - сначала i, потом i++ + 1 i == 0 - вычислили, i - просто идентификатор, стоящий слева, не содержит никаких подвыражений. i++ + 1 - опять, можем считать сначала i++, потом 1, или наоборот, но в данном случае, это не важно. i++ == 0, i становится равной 1 получаем - 1 + 1. Второй вариант - сначала i++ + 1, потом i получим в итоге для i++ + 1 - 1 + 1 но на стадии вычисления i получим 1, но какая разница? Если это затирается? Ничего не поменяется ведь... Где-то тут чувствую я ошибаюсь ОПЕРАНДЫ ВЫЧИСЛИЛИ. 2 Этап - side effect для левого операнда Тут ясно все, все по порядку, вычислили операнды, и начинаем изменять объект i, присваиваем результат 1 + 1 Ну и финал - возврат ссылки на i, как результата выражения. Вот и получается, что тут будет 2 Добавлено через 2 минуты ![]() На самом деле я хотел сказать о другом, что некоторые операции, которые в соответствии с правилом sequence point были UB, могут не являться таковыми в соответствии с правилом sequence before
0
|
||||||||||||||
|
Неэпический
|
||
| 02.07.2016, 17:02 | ||
|
Для вычисления значений i++ + 1 достаточно копии i. Фактически, именно она и будет операндом, а когда будет вычислено остальное - уже пофигу, значение i++ + 1 от этого не изменится.
1
|
||
|
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
|
|
| 02.07.2016, 17:03 [ТС] | |
|
ct0r, ну не компилятор, так абстрактная машина, которая должна обеспечить наблюдаемый результат в соответствии с некими правилами. И вот как раз, почему эта машина делает именно так, а не иначе, я и хочу понять)
0
|
|
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
| 02.07.2016, 17:06 | |
|
Croessmah, как вариант. Зачем нужно писать всякие ++ в выражениях, если это можно просто написать отдельно, что читабельнее и менее подвержено ошибкам?
Разве что чужой быдлокод читать?
0
|
|
|
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
|
|||||||
| 02.07.2016, 17:06 [ТС] | |||||||
|
Croessmah, про копию помню, я ее тут сознательно не упомянул, ибо
То чем это отличается от, например
0
|
|||||||
|
Неэпический
|
||||||||
| 02.07.2016, 17:09 | ||||||||
|
Я стараюсь даже типы в литералах указывать ![]()
P.S. форум - отдельная эпопея, без строгих правил
0
|
||||||||
|
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
|
||
| 02.07.2016, 17:11 [ТС] | ||
![]() Дело в том, что читая Энтони Вильямса (я несколько книг читаю по многопоточности параллельно, кстати одну из которых мне советовали Вы и Убежденный), он начал объяснять про memory_order, то бишь про порядок доступа к памяти. А объясняя это, он вводит понятие "синхронизируется-с", которое базируется на правиле "расположено-перед", и вот из-за непонимания его, я не могу продолжить чтение ![]() Добавлено через 1 минуту Croessmah, а Вы чего не онлайн? Точно как бот
0
|
||
|
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
|
|
| 02.07.2016, 17:16 [ТС] | |
|
0
|
|
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||||
| 02.07.2016, 17:29 | ||||
Сообщение было отмечено ASCII как решение
Решение![]() Пришлось брать англ вариант и поднимать дополнительные статьи. Вот например пара:http://preshing.com/20130702/t... -relation/ http://preshing.com/20130823/t... -relation/
1
|
||||
| 02.07.2016, 17:29 | |
|
Помогаю со студенческими работами здесь
36
Function evaluation timed out
STM32 comStick Evaluation Board CodeVisionAVR Evaluation V2.05.3a выдает ошибку Чем отличается Windows 8.1 Enterprise Evaluation? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|