powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Порядок вычисления
25 сообщений из 110, страница 1 из 5
Порядок вычисления
    #38822608
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Саттера опрос http://herbsutter.com/2014/12/01/a-quick-poll-about-order-of-evaluation/

Код: plaintext
1.
2.
3.
4.
std::vector<int> v = { 0, 0 };
int i = 0;
v[i++] = i++;
std::cout << v[0] << v[1] << endl;


В текущей версии стандарта "v[i++] = i++" - это UB (и даже не один).
Вопрос: какой должна быть логика выполнения данного выражения, если бы мы захотели убрать этот конкретный вид UB в стандарте.
Т.е. какой результат должна печатать программа: 00, 01, 10, или оставить UB?
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822630
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В идеале, чтобы такие выражения всегда компилятор отлавливал с comile error, но думаю что это вряд ли возможно.

А так, наверное 00, это проще было бы понимать. Сначала беруться исходные значения, а уже после отрабатывают все эти obj++:
Т.е.
Код: plaintext
1.
v[i++] = i++;


превращается в:
Код: plaintext
1.
2.
v[i] = i;
i++; i++;



А сами как считаете?
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822639
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то порядок и приоритеты опираций описаны в доке. Только я их не помню. Так никогда не пишу
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822642
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevВообще-то порядок и приоритеты опираций описаны в доке. Только я их не помню. Так никогда не пишу
Тут тема вообще не про это.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822644
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyТ.е. какой результат должна печатать программа: 00, 01, 10, или
оставить UB?
Проголосовал за 01, поскольку вычислять все постинкременты перед всем остальным уж больно
геморройно и неочевидно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822650
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам я считаю что оператор присвоения должен быть sequence point.
Т.е. сначала вычисляется левая часть, потом правая, потом выполняется присвоение.

Код: plaintext
1.
2.
3.
4.
//v[i++] = i++;

T& temp = v[i++];
temp = i++;



Т.е. ответ 10
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822659
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyУ Саттера опрос http://herbsutter.com/2014/12/01/a-quick-poll-about-order-of-evaluation/

Код: plaintext
1.
2.
3.
4.
std::vector<int> v = { 0, 0 };
int i = 0;
v[i++] = i++;
std::cout << v[0] << v[1] << endl;


В текущей версии стандарта "v[i++] = i++" - это UB (и даже не один).
Вопрос: какой должна быть логика выполнения данного выражения, если бы мы захотели убрать этот конкретный вид UB в стандарте.
Т.е. какой результат должна печатать программа: 00, 01, 10, или оставить UB?

Если не undefined behaviour, то 10. Точно не 00
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822662
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что вообще хотел автор получить в векторе?

Код: plaintext
1.
v[i++] = i++;



Голосую за "Unspecified (one of the first three options, but could be different on different compilers)"
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822663
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю, стоит оставить UB, а в целом, согласен с
Вася УткинВ идеале, чтобы такие выражения всегда компилятор отлавливал с compile error, но думаю что это вряд ли возможно.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822692
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyТ.е. сначала вычисляется левая часть, потом правая, потом
выполняется присвоение.
Почему сначала левая? Предположим, вычисление каждой из частей приводит к ошибкам
исполнения (неважно каким). Почему пользователь должен получить ошибку связанную с
вычислением левой части, а не правой?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822701
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyСам я считаю что оператор присвоения должен быть sequence point.
Т.е. сначала вычисляется левая часть, потом правая, потом выполняется присвоение.порядок вычисления аргументов функции не определён, жеж, а тут получается, что мы взяли, и сказали, что вот именно для оператора присваивания - определён. нехорошо как то, имхо ))
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822736
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychпорядок вычисления аргументов функции не определён, жеж, а тут получается,
что мы взяли, и сказали, что вот именно для оператора присваивания - определён. нехорошо
как то, имхо ))
Ещё со времён K&R оператор присваивания вычисляется справа налево.

PS: Порядок вычисления аргументов функции определяется соглашением о вызове.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822753
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
>> Ещё со времён K&R оператор присваивания вычисляется справа налево.
в С операторы - не функции, K&R не имеют отношения к C++, не видишь не стыковки? ))

>> PS: Порядок вычисления аргументов функции определяется соглашением о вызове.
пруф давай. Соглашение о вызове ничего не говорит о порядке вычисления аргументов функции, а говорит куда их класть в каком порядке.

Кстати, развивая твою мысль, если я напишу __cdecl operator=( ... ) будет один результат для исходного вопроса, если __pascal operator=( ... ), то другой, а если __fastcall operator=( ... ), то третий, так? имхо, это UB
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822775
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychв С операторы - не функции, K&R не имеют отношения к C++, не видишь не
стыковки? ))
Операторы возвращают значение? Возвращают. Значит - функции.

egorychКстати, развивая твою мысль, если я напишу __cdecl operator=( ... ) будет
один результат для исходного вопроса, если __pascal operator=( ... ), то другой, а если
__fastcall operator=( ... ), то третий, так? имхо, это UB
У функции оператора присваивания всего один аргумент. Его совершенно всё равно с какой
стороны вычислять.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822797
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevВообще-то порядок и приоритеты опираций описаны в доке. Только я их не помню. Так никогда не пишу

Приоритеты операций не имеют к обсуждаемому вопросу ни малейшего отношения.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822847
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал на GCC: (GNU) 4.8.1.

Код: sql
1.
1 0
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822908
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychпорядок вычисления аргументов функции не определён, жеж, а тут получается, что мы взяли, и сказали, что вот именно для оператора присваивания - определён. нехорошо как то, имхо ))
Так тут как раз речь идет чтобы задать определенное поведение.
Ничего страшного в исключениях из правил я не вижу, если они облегчают программирование.
То, что я предлагаю, хорошо тем, что в каком порядке код записан - так и выполняется.
Все остальные варианты поведения сложнее читаются и никаких преимуществ не имеют.

maytonПопробовал на GCC: (GNU) 4.8.1.

Код: sql
1.
1 0


Умные люди. Понимают толк :)
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822915
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЕщё со времён K&R оператор присваивания вычисляется справа налево.
Это утверждение относится к приоритету и ассоциативности операций, а не к порядку вычисления вообще.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822922
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЭто утверждение относится к приоритету и ассоциативности операций,
а не к порядку вычисления вообще.
Но приоритет в данном случае вытекает из естественного порядка вычисления операндов. При
вычислении цепочки присваиваний слева направо требуется либо накапливать стэк указателей
на значения либо уходить в рекурсию. Порядок справа налево разворачивается в тривиальный
итерационный процесс.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822931
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНичего страшного в исключениях из правил я не вижу, если они облегчают программирование.я тоже, в целом, мне только кажется, что "устандартивание" )) этого кейса будет стимулировать писать код в подобном стиле, а это мне не очень нравится, пусть бы было бы UB, что значит, что так писать не надо.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822943
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyНичего страшного в исключениях из правил я не вижу, если они облегчают программирование.
То, что я предлагаю, хорошо тем, что в каком порядке код записан - так и выполняется .
Убедили, действительно, просто оператор присвоения сделать sequence point.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822944
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Опять же вы не совсем то описываете.
Приоритет операций существует только при синтаксическом анализе.
Проблема затронутая в данном топике возникает на более позднем этапе, когда синтаксическое дерево уже построено и теперь код надо выполнить.
С точки зрения выполнения, присвоение - это вызов функции с двумя аргументами. В каком порядке вычислять аргументы - не имеет значения, главное чтобы все аргументы были готовы на момент вызова.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822947
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychAnatoly MoskovskyНичего страшного в исключениях из правил я не вижу, если они облегчают программирование.я тоже, в целом, мне только кажется, что "устандартивание" )) этого кейса будет стимулировать писать код в подобном стиле, а это мне не очень нравится, пусть бы было бы UB, что значит, что так писать не надо.
Было-бы правильно чтобы чем новее версия при компилляции выдавала WARNING.
И чем новее - тем настойчивее. И правила - жёстче.

Заигнорил? Сам виноват. Сам себе злобный буратино.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822948
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych"устандартивание" )) этого кейса будет стимулировать писать код в подобном стиле
В таком случае надо запретить много чего, чтоб стиль не портить.
Например убрать тернарный оператор, чтобы SashaMercury не злоупотрелбял им
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822951
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonБыло-бы правильно чтобы чем новее версия при компилляции выдавала WARNING.
И чем новее - тем настойчивее. И правила - жёстче.
К сожалению, в реальных программах этот кейс встречается в основном в неявном виде, типа этого.
Код: plaintext
1.
2.
int& j = i; // где-то в другой функции
v[j++] = i++;


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


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