|
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
|
||||||
Order of evaluation02.07.2016, 00:37. Показов 2924. Ответов 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? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|