Так вот вопрос: какой должен быть результат? По правилам C++ значение a не должно измениться, однако все популярные компиляторы (MSVC, GCC) увеличивают значение на 1, а IAR выдает предуждение "undefined behavior".
Здравствуйте, ajanov, Вы писали:
A>Все доброго сремени суток!
A>Сегодня у новичка увидел в коде:
A>
A>a = a++;
A>
A>Так вот вопрос: какой должен быть результат? По правилам C++ значение a не должно измениться, однако все популярные компиляторы (MSVC, GCC) увеличивают значение на 1, а IAR выдает предуждение "undefined behavior".
Это что за правила такие?
Переменная модифицируется два раза между точками следования, так что результат может быть какой угодно.
Undefined behavior и есть.
Здравствуйте, ajanov, Вы писали:
A>Сегодня у новичка увидел в коде:
A>
A>a = a++;
A>
A>Так вот вопрос: какой должен быть результат? По правилам C++ значение a не должно измениться, однако все популярные компиляторы (MSVC, GCC) увеличивают значение на 1, а IAR выдает предуждение "undefined behavior".
Результат — никакой. Undefined behavior. Никаких правил, по которым, "значение a не должно измениться" нет.
Здравствуйте, Fwiffo, Вы писали:
F>Здравствуйте, ajanov, Вы писали:
A>>Все доброго сремени суток!
A>>Сегодня у новичка увидел в коде:
A>>
A>>a = a++;
A>>
A>>Так вот вопрос: какой должен быть результат? По правилам C++ значение a не должно измениться, однако все популярные компиляторы (MSVC, GCC) увеличивают значение на 1, а IAR выдает предуждение "undefined behavior".
F>Это что за правила такие? F>Переменная модифицируется два раза между точками следования, так что результат может быть какой угодно. F>Undefined behavior и есть.
Это правило последовательности выполнения операторов, а последовательность такова:
1) создается временный объект которому приписывается значение 'a'
2) значение а увеличивается на 1
3) а приписывается приписывается значение временного объекта — то есть начальное значение 'а'
Здравствуйте, leo_jan, Вы писали:
_>Это правило последовательности выполнения операторов, а последовательность такова:
Ничего подобного Это — undefined behavior, ни порядок выполнения, ни последовательность действий при таком раскладе не определены. Компилятор может вписать вместо этого вызов "format D:". И будет прав...
_>Друго дело что писать a = a++; — дурной тон
Это не дурной тон, это — неопределённое поведение.
A>>>Так вот вопрос: какой должен быть результат? По правилам C++ значение a не должно измениться, однако все популярные компиляторы (MSVC, GCC) увеличивают значение на 1, а IAR выдает предуждение "undefined behavior".
F>>Это что за правила такие? F>>Переменная модифицируется два раза между точками следования, так что результат может быть какой угодно. F>>Undefined behavior и есть.
_>Это правило последовательности выполнения операторов, а последовательность такова: _>1) создается временный объект которому приписывается значение 'a' _>2) значение а увеличивается на 1 _>3) а приписывается приписывается значение временного объекта — то есть начальное значение 'а'
_>Друго дело что писать a = a++; — дурной тон
Нет, никакой такой последователmности, не говоря уже о каких-то подобных "правилах", здесь нет.
В языках С и С++ выражение 'a = a++;' имеет следующую семантику
1. a++: Взять старое значение 'a', вернуть его в качестве результата и запланировать выполнение побочного эффекта 1: "поместить в 'a' значение А равное старому значению плюс 1"
2. a = (1): Взять возвращенное шагом (1) значение, вернуть его в качесте результата и запланировать выполнение побочного эффекта 2: "поместить в 'a' значение B, полученное с шага (1), т.е. фактически старое значение 'a'"
3. Полное выражение, точка следования: Викинуть нафиг возвращенное шагом (2) значение, выполнить все запланированные к данному моменту побочные эффекты в любом порядке.
Проблема возникает на шаге 3 потому, что к этому моменту у нас запланировано 2 побочных эффекта и финальное значение 'a' зависит от порядка их выполнения.
Здравствуйте, ajanov, Вы писали:
A>Все доброго сремени суток! A>Сегодня у новичка увидел в коде:
A>
A>a = a++;
A>
A>Так вот вопрос: какой должен быть результат? По правилам C++ значение a не должно измениться, однако все популярные компиляторы (MSVC, GCC) увеличивают значение на 1, а IAR выдает предуждение "undefined behavior".
Это еще не самое страшное! Вот код:
#include <iostream>
using namespace std;
int foo (int a) { return a; }
void main(void) {
int i = 1;
i = foo ( i++ );
cout << i << '\n';
}
Ответ должен быть 1? Выводит "1", если компилить в режиме "Debug", и "2" -- в режиме "Release".
Здравствуйте, Alexey F, Вы писали:
_>>Это правило последовательности выполнения операторов, а последовательность такова: AF>Ничего подобного Это — undefined behavior, ни порядок выполнения, ни последовательность действий при таком раскладе не определены. Компилятор может вписать вместо этого вызов "format D:". И будет прав...
Это не undefined behavior, это unspecified behavior. И никаких "format D:", у компилятора есть выбор из двух возможностей, сначала выполнить присваивание, затем постинкрементирование или наоборот.
Здравствуйте, igna, Вы писали:
AF>>Ничего подобного Это — undefined behavior, ни порядок выполнения, ни последовательность действий при таком раскладе не определены. Компилятор может вписать вместо этого вызов "format D:". И будет прав...
I>Это не undefined behavior, это unspecified behavior. И никаких "format D:", у компилятора есть выбор из двух возможностей, сначала выполнить присваивание, затем постинкрементирование или наоборот.
Нет, это именно undefined behavior. Т.е. вплоть до 'format D:'.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>Результат — никакой. Undefined behavior.
I>Откуда там undefined? Unspecified.
Undfined там из стандарта языка. В стандарте сказано — undefined. Значит undefined. А уж откуда у этого заявления станадарта ноги расут — тема отдельная.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>Undfined там из стандарта языка. В стандарте сказано — undefined.
I>Где конкретно оно сказано?
Оно сказано в тексте 5/4. Там же располагается пример с комментарием, который якобы утверждает, что behavior unspecified, но это не более чем давняя и хорошо известная опечатка стандарта. В любом случае, примеры в стандарте не являются нормативными и приритет всегда за текстом стандарта. Где сказано, что behavior undefined.
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>В примере — опечатка, которая уже давным-давно обнаружена, рассмотрена, исправлена и закрыта
АТ>http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#351
АТ>В тексте же перед примером ясно сказано, что поведение не определено (undefined)
Спасибо. Стандарт неисчерпаем, по крайней мере его ошибки. C++