
| Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
![]() |
||
c++ cout
|
||
| Философия, технологии, алгоритмы! |
![]() |
|
|
Опции темы |
|
|
#2 |
|
Форумец
Сообщений: 10,808
Регистрация: 20.09.2002
Возраст: 36
|
потому что так писать нельзя. Поведение кода здесь будет совершенно неопределенным. Компилятор совсем не обязан вычислять эти выражения в порядке вывода, он это может сделать как угодно. Единственное, что можно сказать, что в середине будет единица.
А потом теоретически возможны варианты: 1 1 1 1 1 2 2 1 1 2 1 2 Просто не надо писать такой код. |
|
|
|
|
#3 |
|
Форумец
Сообщений: 334
Регистрация: 14.04.2003
Возраст: 44
|
VC 7.1 release выдает 112, а debug 212.
Неопределен порядок вычисления выражений между точками следования (sequency point). Результат может быть любым. Этот код аналогичен: func ( func ( func (0, i), i++ ), i); |
|
|
|
|
#5 |
|
Форумец
Сообщений: 94
Регистрация: 16.03.2003
|
Я, конечно, не уверен.. Но разве операторы не выполняются слева - направо? Тогда результат 112 логичен..
|
|
|
|
|
#6 |
|
Форумец
Сообщений: 782
Регистрация: 09.01.2003
|
И даже более того:
$ g++ z.cpp -o z && ./z 211 $ g++ z.cpp -O2 -o z && ./z 112 Как видно, если добавить оптимизацию (-O2), то результат другой. $gcc -v | grep version gcc version 3.2.1 (ALT Linux, build 3.2.1-alt2) |
|
|
|
|
#7 |
|
Форумец
Сообщений: 94
Регистрация: 16.03.2003
|
Вот, блин.. И отлаживай потом такое..
![]() В предыдущем посте имел в виду справа налево... Да, похоже, они выполняются как им приспичит
|
|
|
|
|
#8 |
|
Форумец
Сообщений: 782
Регистрация: 09.01.2003
|
Павел-Kikoz Чтобы не отлаживать такое, не надо такое писать. Кстати, если
cout << i << i++ << i заменить на printf("%d%d%d", i, i++, i) то результат будет более предсказуемым. У меня всегда получается 2 1 1 |
|
|
|
|
#9 |
|
Форумец
Сообщений: 334
Регистрация: 14.04.2003
Возраст: 44
|
Павел-Kikoz
> Да, похоже, они выполняются как им приспичит Может стоит выучить язык на котором пишите?
|
|
|
|
|
#12 |
|
Форумец
Сообщений: 94
Регистрация: 16.03.2003
|
Unforgiven
Ды я и не пишу таких конструкций, себе дороже... Кстати, RomanPshenichny утверждает, что "этот код аналогичен func ( func ( func (0, i), i++ ), i);" RomanPshenichny Язык-то стоит выучить... Только я не уверен, что его легко выучить на 100% (сколько там странц стандарт занимает?) А в неком достаточном объеме я его знаю (смею надеяться) |
|
|
|
|
#15 |
|
Форумец
Сообщений: 782
Регистрация: 09.01.2003
|
DoZeR, само собой.
Только к чему ты это сказал? Тут где-нибудь приведен полный текст программы? |
|
|
|
|
#16 |
|
Форумец
Сообщений: 94
Регистрация: 16.03.2003
|
zic
Стандарт и спецификация использовались мной как синонимы. Ок, спецификация языка с++. cout и оператор ++ это явно стандатрные переносимы вещи, не всякие там __property Да и тут не только MS VC касается, как я понял... Ну ладно, чот-то народ начал придираться к словам... Ну не работает и не работает, черт с ним. |
|
|
|
|
#18 |
|
Форумец
Сообщений: 334
Регистрация: 14.04.2003
Возраст: 44
|
Павел-Kikoz
> Кстати, RomanPshenichny утверждает, что "этот код > аналогичен func ( func ( func (0, i), i++ ), i);" cout << i << i++ << i, это: ( ( (cout::operator << (i) )::operator << (i++) )::operator << (i) и для педантов: ( ( (std::basic_ostream<char,std::char_traits<char> >::operator<< (i) )::operator << (i++) )::operator << (i). В функциональном виде код аналогичен func ( func ( func (0, i), i++ ), i). В котором тоже будет наблюдатся такое же неопределенное поведение. Точка следования в обоих вариантах одна. Все пераметры operator << и func вычисляются до вызова самих функций. Т.е. сначала посчитали i, i++, i, а потом уже вызвали функции. Порядок вычисления i, i++, i внутри одной точки следования не определен. Что такое точка следования -- читайте в книжках по C++. > сколько там странц стандарт занимает ~700. Но это смотря каким шрифтом ;) zic > с каких это пор реализации языков от MS соответсвуют > каким то стандартам ? С 2003 года, с VC 7.1. Казалось бы, причем тут MS? ;) Это стандартный undefined behaviour описанный в стандарте. |
|
|
|
|
#20 |
|
Форумец
Сообщений: 782
Регистрация: 09.01.2003
|
RomanPshenichny, маленькое уточнение:
( ( (cout.operator << (i) ).operator << (i++) ).operator << (i) |
|
|
|
|
#21 |
|
Форумец
Сообщений: 94
Регистрация: 16.03.2003
|
RomanPshenichny
Блин, если бы я не знал, что операторы работают как функции, я бы вообще не полез в тему ![]() "Порядок вычисления i, i++, i внутри одной точки следования не определен." - вот именно поэтому я и написал, что все достачно сложно. |
|
|
|
|
#22 | |||
|
Registered User
Сообщений: 67
Регистрация: 08.07.2003
Возраст: 45
|
Re: c++ cout
Цитата:
Fisher добавил [date]1069425240[/date]: Цитата:
Цитата:
|
|||
|
|