Порядок вычисления

Anatoly Moskovsky
Дата: 02.12.2014 14:29:57
У Саттера опрос http://herbsutter.com/2014/12/01/a-quick-poll-about-order-of-evaluation/

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?
Вася Уткин
Дата: 02.12.2014 14:41:35
В идеале, чтобы такие выражения всегда компилятор отлавливал с comile error, но думаю что это вряд ли возможно.

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

превращается в:
v[i] = i;
i++; i++;


А сами как считаете?
Leonid Kudryavtsev
Дата: 02.12.2014 14:49:00
Вообще-то порядок и приоритеты опираций описаны в доке. Только я их не помню. Так никогда не пишу
Anatoly Moskovsky
Дата: 02.12.2014 14:53:15
Leonid Kudryavtsev
Вообще-то порядок и приоритеты опираций описаны в доке. Только я их не помню. Так никогда не пишу

Тут тема вообще не про это.
Dimitry Sibiryakov
Дата: 02.12.2014 14:54:24

Anatoly Moskovsky
Т.е. какой результат должна печатать программа: 00, 01, 10, или
оставить UB?

Проголосовал за 01, поскольку вычислять все постинкременты перед всем остальным уж больно
геморройно и неочевидно.

Posted via ActualForum NNTP Server 1.5

Anatoly Moskovsky
Дата: 02.12.2014 14:57:08
Сам я считаю что оператор присвоения должен быть sequence point.
Т.е. сначала вычисляется левая часть, потом правая, потом выполняется присвоение.

//v[i++] = i++;

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


Т.е. ответ 10
SashaMercury
Дата: 02.12.2014 15:02:01
Anatoly Moskovsky
У Саттера опрос http://herbsutter.com/2014/12/01/a-quick-poll-about-order-of-evaluation/

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
mayton
Дата: 02.12.2014 15:04:11
А что вообще хотел автор получить в векторе?

v[i++] = i++;


Голосую за "Unspecified (one of the first three options, but could be different on different compilers)"
egorych
Дата: 02.12.2014 15:04:12
думаю, стоит оставить UB, а в целом, согласен с
Вася Уткин
В идеале, чтобы такие выражения всегда компилятор отлавливал с compile error, но думаю что это вряд ли возможно.
Dimitry Sibiryakov
Дата: 02.12.2014 15:28:27

Anatoly Moskovsky
Т.е. сначала вычисляется левая часть, потом правая, потом
выполняется присвоение.

Почему сначала левая? Предположим, вычисление каждой из частей приводит к ошибкам
исполнения (неважно каким). Почему пользователь должен получить ошибку связанную с
вычислением левой части, а не правой?

Posted via ActualForum NNTP Server 1.5