Почему на выходе 2 1 2, ведь должно 1 1 2 ?
[Ответ]
Noname 18:42 06.11.2003
потому что так писать нельзя. Поведение кода здесь будет совершенно неопределенным. Компилятор совсем не обязан вычислять эти выражения в порядке вывода, он это может сделать как угодно. Единственное, что можно сказать, что в середине будет единица.
А потом теоретически возможны варианты:
Может стоит выучить язык на котором пишите? [Ответ]
zic 19:31 10.11.2003
Веревка достаточной длины чтобы выстрелить себе в ногу . Или как правильно писать программы на Си .
[Ответ]
LSL 21:36 10.11.2003
Спасибо. Друг будет доволен бедный друг...он обречён : ): )
[Ответ]
Павел-Kikoz 09:27 11.11.2003
Unforgiven
Ды я и не пишу таких конструкций, себе дороже...
Кстати, RomanPshenichny утверждает, что "этот код аналогичен
func ( func ( func (0, i), i++ ), i);" RomanPshenichny
Язык-то стоит выучить... Только я не уверен, что его легко выучить на 100% (сколько там странц стандарт занимает?) А в неком достаточном объеме я его знаю (смею надеяться)
[Ответ]
zic 09:31 11.11.2003
Павел-Kikoz
Какой стандарт ?
с каких это пор реализации языков от MS соответсвуют каким то стандартам ? И уж точно не ансишным .
Может спецификация ?
[Ответ]
DoZeR, само собой.
Только к чему ты это сказал? Тут где-нибудь приведен полный текст программы?
[Ответ]
Павел-Kikoz 15:52 11.11.2003
zic
Стандарт и спецификация использовались мной как синонимы. Ок, спецификация языка с++.
cout и оператор ++ это явно стандатрные переносимы вещи, не всякие там __property
Да и тут не только MS VC касается, как я понял...
Ну ладно, чот-то народ начал придираться к словам...
Ну не работает и не работает, черт с ним.
[Ответ]
zic 16:23 11.11.2003
Ессно не только MS .
НУ так речь то не о том ? [Ответ]
RomanPshenichny 21:20 11.11.2003
Павел-Kikoz
> Кстати, RomanPshenichny утверждает, что "этот код
> аналогичен func ( func ( func (0, i), i++ ), 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 описанный в стандарте.
[Ответ]
zic 00:35 12.11.2003
RomanPshenichny
ДА я не спорю что темотаг наблюдается в любом случае .
Я просто к тому что в MS любит придумывать свои стандарты .
А не следывать общепринятым .
[Ответ]
RomanPshenichny
Блин, если бы я не знал, что операторы работают как функции, я бы вообще не полез в тему
"Порядок вычисления i, i++, i внутри одной точки следования не определен." - вот именно поэтому я и написал, что все достачно сложно.
[Ответ]
Fisher 16:12 21.11.2003
Сообщение от : Первоначальное сообщение от LSL Друг-сишник задался вопросом:
i = 1
cout << i << i++ << i
Почему на выходе 2 1 2, ведь должно 1 1 2 ?
Ничего не должно быть, т.к. тут undefined behaviour и поэтому может быть все, что угодно, вплоть до форматирования диска.
Fisher добавил [date]1069425240[/date]:
Сообщение от : Первоначальное сообщение от RomanPshenichny
Точка следования в обоих вариантах одна.[/B]
Все пераметры operator << и func вычисляются до вызова самих функций.
Все аргументы не обязаны вычисляться до вызова первой из функций.
Сообщение от :
Т.е. сначала посчитали i, i++, i, а потом уже вызвали функции. Порядок вычисления i, i++, i внутри одной точки следования не определен.
Дело не в том, что не определен порядок вычисления подвыражений внутри выражений, а в том, что нет гарантированных точек следования между вычислением i и i++. Undefined behaviour.
[Ответ]