a = a++; каков результат?
От: ajanov  
Дата: 29.04.09 16:59
Оценка: :))
Все доброго сремени суток!

Сегодня у новичка увидел в коде:


a = a++;



Так вот вопрос: какой должен быть результат? По правилам C++ значение a не должно измениться, однако все популярные компиляторы (MSVC, GCC) увеличивают значение на 1, а IAR выдает предуждение "undefined behavior".
Re: a = a++; каков результат?
От: Fwiffo Россия  
Дата: 29.04.09 17:09
Оценка: 1 (1) +4
Здравствуйте, ajanov, Вы писали:

A>Все доброго сремени суток!


A>Сегодня у новичка увидел в коде:



A>
A>a = a++;
A>



A>Так вот вопрос: какой должен быть результат? По правилам C++ значение a не должно измениться, однако все популярные компиляторы (MSVC, GCC) увеличивают значение на 1, а IAR выдает предуждение "undefined behavior".


Это что за правила такие?
Переменная модифицируется два раза между точками следования, так что результат может быть какой угодно.
Undefined behavior и есть.
Re: a = a++; каков результат?
От: Андрей Тарасевич Беларусь  
Дата: 29.04.09 17:15
Оценка:
Здравствуйте, ajanov, Вы писали:

A>Сегодня у новичка увидел в коде:



A>
A>a = a++;
A>



A>Так вот вопрос: какой должен быть результат? По правилам C++ значение a не должно измениться, однако все популярные компиляторы (MSVC, GCC) увеличивают значение на 1, а IAR выдает предуждение "undefined behavior".


Результат — никакой. Undefined behavior. Никаких правил, по которым, "значение a не должно измениться" нет.
Best regards,
Андрей Тарасевич
Re[2]: a = a++; каков результат?
От: leo_jan Армения  
Дата: 29.04.09 18:44
Оценка: -5
Здравствуйте, 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) а приписывается приписывается значение временного объекта — то есть начальное значение 'а'

Друго дело что писать a = a++; — дурной тон
Re[3]: a = a++; каков результат?
От: Alexey F  
Дата: 29.04.09 18:56
Оценка: +5
Здравствуйте, leo_jan, Вы писали:

_>Это правило последовательности выполнения операторов, а последовательность такова:

Ничего подобного Это — undefined behavior, ни порядок выполнения, ни последовательность действий при таком раскладе не определены. Компилятор может вписать вместо этого вызов "format D:". И будет прав...

_>Друго дело что писать a = a++; — дурной тон

Это не дурной тон, это — неопределённое поведение.
Re[3]: a = a++; каков результат?
От: Андрей Тарасевич Беларусь  
Дата: 29.04.09 19:02
Оценка: +3
Здравствуйте, leo_jan, Вы писали:

A>>>
A>>>a = 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' зависит от порядка их выполнения.
Best regards,
Андрей Тарасевич
Re[4]: a = a++; каков результат?
От: Андрей Тарасевич Беларусь  
Дата: 29.04.09 19:04
Оценка:
АТ>В языках С и С++ выражение 'a = a++;' имеет следующую семантику

Имея в виду, что мы игнорируем на минутку факт наличия неопределенного поведения и разбираем это выражение на общих основаниях.
Best regards,
Андрей Тарасевич
Re: a = a++; каков результат?
От: vadimcher  
Дата: 29.04.09 20:53
Оценка:
Здравствуйте, 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".

А вот зайца кому, зайца-выбегайца?!
Re[4]: a = a++; каков результат?
От: igna Россия  
Дата: 30.04.09 05:36
Оценка: -1
Здравствуйте, Alexey F, Вы писали:

_>>Это правило последовательности выполнения операторов, а последовательность такова:

AF>Ничего подобного Это — undefined behavior, ни порядок выполнения, ни последовательность действий при таком раскладе не определены. Компилятор может вписать вместо этого вызов "format D:". И будет прав...

Это не undefined behavior, это unspecified behavior. И никаких "format D:", у компилятора есть выбор из двух возможностей, сначала выполнить присваивание, затем постинкрементирование или наоборот.
Re: a = a++; каков результат?
От: igna Россия  
Дата: 30.04.09 05:36
Оценка:
Здравствуйте, ajanov, Вы писали:

A>Сегодня у новичка увидел в коде:


A>a = a++;


Возможно новичок издевался.

A>По правилам C++ значение a не должно измениться


А если сначала будет выполнено присваивание, а лишь потом постинкрементирование?
Re[2]: a = a++; каков результат?
От: igna Россия  
Дата: 30.04.09 05:38
Оценка:
Здравствуйте, Fwiffo, Вы писали:

F>Undefined behavior и есть.


Unspecified behavior.
Re[5]: a = a++; каков результат?
От: Андрей Тарасевич Беларусь  
Дата: 30.04.09 05:40
Оценка:
Здравствуйте, igna, Вы писали:

AF>>Ничего подобного Это — undefined behavior, ни порядок выполнения, ни последовательность действий при таком раскладе не определены. Компилятор может вписать вместо этого вызов "format D:". И будет прав...


I>Это не undefined behavior, это unspecified behavior. И никаких "format D:", у компилятора есть выбор из двух возможностей, сначала выполнить присваивание, затем постинкрементирование или наоборот.


Нет, это именно undefined behavior. Т.е. вплоть до 'format D:'.
Best regards,
Андрей Тарасевич
Re[3]: a = a++; каков результат?
От: Андрей Тарасевич Беларусь  
Дата: 30.04.09 05:41
Оценка: +1
Здравствуйте, igna, Вы писали:

F>>Undefined behavior и есть.


I>Unspecified behavior.


Undefined. Именно undefined.
Best regards,
Андрей Тарасевич
Re[2]: a = a++; каков результат?
От: igna Россия  
Дата: 30.04.09 05:41
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Результат — никакой. Undefined behavior.


Откуда там undefined? Unspecified.
Re[3]: a = a++; каков результат?
От: Андрей Тарасевич Беларусь  
Дата: 30.04.09 05:43
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>Результат — никакой. Undefined behavior.


I>Откуда там undefined? Unspecified.


Undfined там из стандарта языка. В стандарте сказано — undefined. Значит undefined. А уж откуда у этого заявления станадарта ноги расут — тема отдельная.
Best regards,
Андрей Тарасевич
Re[4]: a = a++; каков результат?
От: igna Россия  
Дата: 30.04.09 05:44
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Undefined. Именно undefined.


Вот пример с комментарием из стандарта:


5 Expressions

. . .

4

i = ++i + 1; // the behavior is unspecified

Re[4]: a = a++; каков результат?
От: igna Россия  
Дата: 30.04.09 05:45
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Undfined там из стандарта языка. В стандарте сказано — undefined.


Где конкретно оно сказано?
Re[5]: a = a++; каков результат?
От: Андрей Тарасевич Беларусь  
Дата: 30.04.09 06:20
Оценка: +1
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>Undfined там из стандарта языка. В стандарте сказано — undefined.


I>Где конкретно оно сказано?


Оно сказано в тексте 5/4. Там же располагается пример с комментарием, который якобы утверждает, что behavior unspecified, но это не более чем давняя и хорошо известная опечатка стандарта. В любом случае, примеры в стандарте не являются нормативными и приритет всегда за текстом стандарта. Где сказано, что behavior undefined.
Best regards,
Андрей Тарасевич
Re[5]: a = a++; каков результат?
От: Андрей Тарасевич Беларусь  
Дата: 30.04.09 06:23
Оценка: 7 (2)
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>Undefined. Именно undefined.


I>Вот пример с комментарием из стандарта:


В примере — опечатка, которая уже давным-давно обнаружена, рассмотрена, исправлена и закрыта

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#351

В тексте же перед примером ясно сказано, что поведение не определено (undefined)
Best regards,
Андрей Тарасевич
Re[6]: a = a++; каков результат?
От: igna Россия  
Дата: 30.04.09 06:40
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>В примере — опечатка, которая уже давным-давно обнаружена, рассмотрена, исправлена и закрыта


АТ>http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#351


АТ>В тексте же перед примером ясно сказано, что поведение не определено (undefined)


Спасибо. Стандарт неисчерпаем, по крайней мере его ошибки. C++
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.