Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
У Саттера опрос http://herbsutter.com/2014/12/01/a-quick-poll-about-order-of-evaluation/ Код: plaintext 1. 2. 3. 4. В текущей версии стандарта "v[i++] = i++" - это UB (и даже не один). Вопрос: какой должна быть логика выполнения данного выражения, если бы мы захотели убрать этот конкретный вид UB в стандарте. Т.е. какой результат должна печатать программа: 00, 01, 10, или оставить UB? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 14:29 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
В идеале, чтобы такие выражения всегда компилятор отлавливал с comile error, но думаю что это вряд ли возможно. А так, наверное 00, это проще было бы понимать. Сначала беруться исходные значения, а уже после отрабатывают все эти obj++: Т.е. Код: plaintext 1. превращается в: Код: plaintext 1. 2. А сами как считаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 14:41 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Вообще-то порядок и приоритеты опираций описаны в доке. Только я их не помню. Так никогда не пишу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 14:49 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevВообще-то порядок и приоритеты опираций описаны в доке. Только я их не помню. Так никогда не пишу Тут тема вообще не про это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 14:53 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyТ.е. какой результат должна печатать программа: 00, 01, 10, или оставить UB? Проголосовал за 01, поскольку вычислять все постинкременты перед всем остальным уж больно геморройно и неочевидно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 14:54 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Сам я считаю что оператор присвоения должен быть sequence point. Т.е. сначала вычисляется левая часть, потом правая, потом выполняется присвоение. Код: plaintext 1. 2. 3. 4. Т.е. ответ 10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 14:57 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyУ Саттера опрос http://herbsutter.com/2014/12/01/a-quick-poll-about-order-of-evaluation/ Код: plaintext 1. 2. 3. 4. В текущей версии стандарта "v[i++] = i++" - это UB (и даже не один). Вопрос: какой должна быть логика выполнения данного выражения, если бы мы захотели убрать этот конкретный вид UB в стандарте. Т.е. какой результат должна печатать программа: 00, 01, 10, или оставить UB? Если не undefined behaviour, то 10. Точно не 00 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 15:02 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
А что вообще хотел автор получить в векторе? Код: plaintext 1. Голосую за "Unspecified (one of the first three options, but could be different on different compilers)" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 15:04 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
думаю, стоит оставить UB, а в целом, согласен с Вася УткинВ идеале, чтобы такие выражения всегда компилятор отлавливал с compile error, но думаю что это вряд ли возможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 15:04 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyТ.е. сначала вычисляется левая часть, потом правая, потом выполняется присвоение. Почему сначала левая? Предположим, вычисление каждой из частей приводит к ошибкам исполнения (неважно каким). Почему пользователь должен получить ошибку связанную с вычислением левой части, а не правой? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 15:28 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyСам я считаю что оператор присвоения должен быть sequence point. Т.е. сначала вычисляется левая часть, потом правая, потом выполняется присвоение.порядок вычисления аргументов функции не определён, жеж, а тут получается, что мы взяли, и сказали, что вот именно для оператора присваивания - определён. нехорошо как то, имхо )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 15:34 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
egorychпорядок вычисления аргументов функции не определён, жеж, а тут получается, что мы взяли, и сказали, что вот именно для оператора присваивания - определён. нехорошо как то, имхо )) Ещё со времён K&R оператор присваивания вычисляется справа налево. PS: Порядок вычисления аргументов функции определяется соглашением о вызове. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 16:01 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov >> Ещё со времён K&R оператор присваивания вычисляется справа налево. в С операторы - не функции, K&R не имеют отношения к C++, не видишь не стыковки? )) >> PS: Порядок вычисления аргументов функции определяется соглашением о вызове. пруф давай. Соглашение о вызове ничего не говорит о порядке вычисления аргументов функции, а говорит куда их класть в каком порядке. Кстати, развивая твою мысль, если я напишу __cdecl operator=( ... ) будет один результат для исходного вопроса, если __pascal operator=( ... ), то другой, а если __fastcall operator=( ... ), то третий, так? имхо, это UB ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 16:17 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
egorychв С операторы - не функции, K&R не имеют отношения к C++, не видишь не стыковки? )) Операторы возвращают значение? Возвращают. Значит - функции. egorychКстати, развивая твою мысль, если я напишу __cdecl operator=( ... ) будет один результат для исходного вопроса, если __pascal operator=( ... ), то другой, а если __fastcall operator=( ... ), то третий, так? имхо, это UB У функции оператора присваивания всего один аргумент. Его совершенно всё равно с какой стороны вычислять. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 16:37 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevВообще-то порядок и приоритеты опираций описаны в доке. Только я их не помню. Так никогда не пишу Приоритеты операций не имеют к обсуждаемому вопросу ни малейшего отношения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 16:54 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Попробовал на GCC: (GNU) 4.8.1. Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 17:23 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
egorychпорядок вычисления аргументов функции не определён, жеж, а тут получается, что мы взяли, и сказали, что вот именно для оператора присваивания - определён. нехорошо как то, имхо )) Так тут как раз речь идет чтобы задать определенное поведение. Ничего страшного в исключениях из правил я не вижу, если они облегчают программирование. То, что я предлагаю, хорошо тем, что в каком порядке код записан - так и выполняется. Все остальные варианты поведения сложнее читаются и никаких преимуществ не имеют. maytonПопробовал на GCC: (GNU) 4.8.1. Код: sql 1. Умные люди. Понимают толк :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 18:15 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЕщё со времён K&R оператор присваивания вычисляется справа налево. Это утверждение относится к приоритету и ассоциативности операций, а не к порядку вычисления вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 18:20 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЭто утверждение относится к приоритету и ассоциативности операций, а не к порядку вычисления вообще. Но приоритет в данном случае вытекает из естественного порядка вычисления операндов. При вычислении цепочки присваиваний слева направо требуется либо накапливать стэк указателей на значения либо уходить в рекурсию. Порядок справа налево разворачивается в тривиальный итерационный процесс. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 18:35 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyНичего страшного в исключениях из правил я не вижу, если они облегчают программирование.я тоже, в целом, мне только кажется, что "устандартивание" )) этого кейса будет стимулировать писать код в подобном стиле, а это мне не очень нравится, пусть бы было бы UB, что значит, что так писать не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 18:41 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyНичего страшного в исключениях из правил я не вижу, если они облегчают программирование. То, что я предлагаю, хорошо тем, что в каком порядке код записан - так и выполняется . Убедили, действительно, просто оператор присвоения сделать sequence point. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 18:52 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Опять же вы не совсем то описываете. Приоритет операций существует только при синтаксическом анализе. Проблема затронутая в данном топике возникает на более позднем этапе, когда синтаксическое дерево уже построено и теперь код надо выполнить. С точки зрения выполнения, присвоение - это вызов функции с двумя аргументами. В каком порядке вычислять аргументы - не имеет значения, главное чтобы все аргументы были готовы на момент вызова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 18:52 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
egorychAnatoly MoskovskyНичего страшного в исключениях из правил я не вижу, если они облегчают программирование.я тоже, в целом, мне только кажется, что "устандартивание" )) этого кейса будет стимулировать писать код в подобном стиле, а это мне не очень нравится, пусть бы было бы UB, что значит, что так писать не надо. Было-бы правильно чтобы чем новее версия при компилляции выдавала WARNING. И чем новее - тем настойчивее. И правила - жёстче. Заигнорил? Сам виноват. Сам себе злобный буратино. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 18:59 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
egorych"устандартивание" )) этого кейса будет стимулировать писать код в подобном стиле В таком случае надо запретить много чего, чтоб стиль не портить. Например убрать тернарный оператор, чтобы SashaMercury не злоупотрелбял им ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 19:00 |
|
||
|
Порядок вычисления
|
|||
|---|---|---|---|
|
#18+
maytonБыло-бы правильно чтобы чем новее версия при компилляции выдавала WARNING. И чем новее - тем настойчивее. И правила - жёстче. К сожалению, в реальных программах этот кейс встречается в основном в неявном виде, типа этого. Код: plaintext 1. 2. Отследить алиасинг не всегда возможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 19:02 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38822642&tid=2018480]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 14ms |
| total: | 160ms |

| 0 / 0 |
