Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
c++ cout |
Философия, технологии, алгоритмы! |
|
Опции темы |
06.11.2003, 18:42 | #2 |
Форумец
Сообщений: 10,697
Регистрация: 20.09.2002
Возраст: 34
Не в сети |
потому что так писать нельзя. Поведение кода здесь будет совершенно неопределенным. Компилятор совсем не обязан вычислять эти выражения в порядке вывода, он это может сделать как угодно. Единственное, что можно сказать, что в середине будет единица.
А потом теоретически возможны варианты: 1 1 1 1 1 2 2 1 1 2 1 2 Просто не надо писать такой код. |
06.11.2003, 18:58 | #3 |
Форумец
Сообщений: 334
Регистрация: 14.04.2003
Возраст: 42
Не в сети |
VC 7.1 release выдает 112, а debug 212.
Неопределен порядок вычисления выражений между точками следования (sequency point). Результат может быть любым. Этот код аналогичен: func ( func ( func (0, i), i++ ), i); |
07.11.2003, 14:45 | #5 |
Форумец
Сообщений: 94
Регистрация: 16.03.2003
Не в сети |
Я, конечно, не уверен.. Но разве операторы не выполняются слева - направо? Тогда результат 112 логичен..
|
10.11.2003, 09:02 | #6 |
Форумец
Сообщений: 792
Регистрация: 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) |
10.11.2003, 09:32 | #7 |
Форумец
Сообщений: 94
Регистрация: 16.03.2003
Не в сети |
Вот, блин.. И отлаживай потом такое..
В предыдущем посте имел в виду справа налево... Да, похоже, они выполняются как им приспичит |
10.11.2003, 10:03 | #8 |
Форумец
Сообщений: 792
Регистрация: 09.01.2003
Не в сети |
Павел-Kikoz Чтобы не отлаживать такое, не надо такое писать. Кстати, если
cout << i << i++ << i заменить на printf("%d%d%d", i, i++, i) то результат будет более предсказуемым. У меня всегда получается 2 1 1 |
10.11.2003, 11:55 | #9 |
Форумец
Сообщений: 334
Регистрация: 14.04.2003
Возраст: 42
Не в сети |
Павел-Kikoz
> Да, похоже, они выполняются как им приспичит Может стоит выучить язык на котором пишите? |
11.11.2003, 09:27 | #12 |
Форумец
Сообщений: 94
Регистрация: 16.03.2003
Не в сети |
Unforgiven
Ды я и не пишу таких конструкций, себе дороже... Кстати, RomanPshenichny утверждает, что "этот код аналогичен func ( func ( func (0, i), i++ ), i);" RomanPshenichny Язык-то стоит выучить... Только я не уверен, что его легко выучить на 100% (сколько там странц стандарт занимает?) А в неком достаточном объеме я его знаю (смею надеяться) |
11.11.2003, 13:28 | #15 |
Форумец
Сообщений: 792
Регистрация: 09.01.2003
Не в сети |
DoZeR, само собой.
Только к чему ты это сказал? Тут где-нибудь приведен полный текст программы? |
11.11.2003, 15:52 | #16 |
Форумец
Сообщений: 94
Регистрация: 16.03.2003
Не в сети |
zic
Стандарт и спецификация использовались мной как синонимы. Ок, спецификация языка с++. cout и оператор ++ это явно стандатрные переносимы вещи, не всякие там __property Да и тут не только MS VC касается, как я понял... Ну ладно, чот-то народ начал придираться к словам... Ну не работает и не работает, черт с ним. |
11.11.2003, 21:20 | #18 |
Форумец
Сообщений: 334
Регистрация: 14.04.2003
Возраст: 42
Не в сети |
Павел-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 описанный в стандарте. |
12.11.2003, 08:34 | #20 |
Форумец
Сообщений: 792
Регистрация: 09.01.2003
Не в сети |
RomanPshenichny, маленькое уточнение:
( ( (cout.operator << (i) ).operator << (i++) ).operator << (i) |
12.11.2003, 09:38 | #21 |
Форумец
Сообщений: 94
Регистрация: 16.03.2003
Не в сети |
RomanPshenichny
Блин, если бы я не знал, что операторы работают как функции, я бы вообще не полез в тему "Порядок вычисления i, i++, i внутри одной точки следования не определен." - вот именно поэтому я и написал, что все достачно сложно. |
21.11.2003, 16:12 | #22 | |||
Registered User
Сообщений: 67
Регистрация: 08.07.2003
Возраст: 43
Не в сети |
Re: c++ cout
Цитата:
Fisher добавил [date]1069425240[/date]: Цитата:
Цитата:
|
|||