![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Lamak |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 204 Регистрация: 8.5.2005 Где: Украина,Одесса Репутация: нет Всего: 7 |
Отвечая на вопрос что напечатает прога
я ответил 30 30 ![]() ![]() Обьясните почему она печатает другую строку. --------------------
Роботы - это интересно и увлекательно! |
|||
|
||||
Illuminaty |
|
|||
![]() /*Антон Захаров*/ ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1238 Регистрация: 19.3.2005 Где: Россия, Казань Репутация: нет Всего: 56 |
Видимо, она напечатала 30 31? a++ - Печатает a, увеличивает a на 1 a-- - печатает a+1, уменьшает (a+1) на 1 |
|||
|
||||
AISIN |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 27.1.2005 Где: Пушкино Репутация: нет Всего: 1 |
точно!!!
Lamak Вам нужно разобраться с инкрементом и декриментом. --------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002% |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
на самом деле она печатает 29 30
![]() -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
HELPER |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 18.4.2005 Репутация: -2 Всего: -2 |
29 30 а почему так происходит??
ведь а = 30... как а++ = 29?... Добавлено @ 14:38 даже если:
выводит 29 30!!! че ето инкремент не работает... |
|||
|
||||
Illuminaty |
|
|||
![]() /*Антон Захаров*/ ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1238 Регистрация: 19.3.2005 Где: Россия, Казань Репутация: нет Всего: 56 |
А так "нормально" выводит 30 31. Я уже не знаю что такое "нормально" ![]() |
|||
|
||||
Alastis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 15.11.2004 Где: Казахстан, Астана Репутация: 4 Всего: 10 |
да... любопытно... 29 30
-------------------- Прости, что я говорю, когда ты меня перебиваешь. |
|||
|
||||
Alastis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 15.11.2004 Где: Казахстан, Астана Репутация: 4 Всего: 10 |
а ну да, все правильно... вычисление идет справа налево как положено
![]() -------------------- Прости, что я говорю, когда ты меня перебиваешь. |
|||
|
||||
Illuminaty |
|
|||
![]() /*Антон Захаров*/ ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1238 Регистрация: 19.3.2005 Где: Россия, Казань Репутация: нет Всего: 56 |
Точно. Браво! |
|||
|
||||
Lamak |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 204 Регистрация: 8.5.2005 Где: Украина,Одесса Репутация: нет Всего: 7 |
Из вышесказаного я понял так , что сначало выполняется a-- и a=29;
потом а печатается и оператором а++ получается 30 и печатается. Кажется так. ![]() --------------------
Роботы - это интересно и увлекательно! |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Э-э, люди, а это случаем не undefined behaviour? (5.4) Долго вчитывался в стандарт: сначала по выражениям, а потом по требованиям к потокам - но истины так и не постиг
![]() ![]() MSVC 7.1: 30 30 Intel 7.1: 30 31 CBuilder 6: 29 30 -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Alastis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 15.11.2004 Где: Казахстан, Астана Репутация: 4 Всего: 10 |
у меня как раз 7.1, а результат 29 30 -------------------- Прости, что я говорю, когда ты меня перебиваешь. |
|||
|
||||
Lamak |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 204 Регистрация: 8.5.2005 Где: Украина,Одесса Репутация: нет Всего: 7 |
Я разобрался и работает оно не так,а вот как: Компилятор обрабатывая строку
,сначала вычисляет выражения в обратном порядке как положенно и делает это так: - записывает в стек для cout а=30 - вычисляет -- : присваевает а=29 - записывает в стек для cout а=29 - вычисляет ++: присваевает а=30 Потом cout печатает данные из стека т.е. 29 30. ![]() --------------------
Роботы - это интересно и увлекательно! |
||||
|
|||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Вот уж не знаю ![]() А вообще, все это не имеет значения: есть факт - три компилятора выдали три разных результата для элементарной конструкции. Значит, что-то в ней не так. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Alastis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 15.11.2004 Где: Казахстан, Астана Репутация: 4 Всего: 10 |
а вот это уже действительно любопытно: компилирую в Debug - результат 29 30, в Release - 30 30
-------------------- Прости, что я говорю, когда ты меня перебиваешь. |
|||
|
||||
En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
ВЫВОД:
Не следует употреблять подобные конструкции. ![]() |
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
А вообще - это довольно undefined behavior, посудите сами: что думать компилятору если << это операция обьявленная юзером. Порядок определения операций не определен стандартом, поэтому следует больше избегать таких операций.
--------------------
|
|||
|
||||
HELPER |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 18.4.2005 Репутация: -2 Всего: -2 |
А у меня норма, в debug, release всегда 29 30, а может дело вообще не в компиляторах??? может дело в самой iostream.h? может в компиляторах:
просто идет не родная библиотека, а модифицированная, например размер h файла: VC++ 3-4 kb BC5.02 36 kb TC 28 kb BC 31 kb Добавлено @ 08:45 Я к чему ето все... ![]() Неужели, за веремя существования этой библиотеки в нее не вносили изменений серьезные дяденьки программисты? ![]() |
||||
|
|||||
Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
А при чем тут потоки? Они всего-навсего определяют семантику операторов >> и << - как и в каком порядке вычислять операнды - дело компилятора.
Дык, это часть стандартной библиотеки C++ - стандарт не определяет реализацию, он только выдвигает определенные требования, которым должна соответствовать библиотека - и все. Существует масса реализаций, наиболее популярны те, что получили свое начало в недрах HP и SGI (сколько я знаю, корни у Dinkumware и STLPort все там же). Так вот, я к тому, что стандарт не определяет, как должен вести себя компилятор в такой ситуации - значит это undefined behaviour - значит это зло! ![]() P.S. Кстати, а где народ iostream.h в MSVC 7.1 откопал? К счастью, этот deprecated хидер оттуда выкинут и есть только iostream. С ним и тестировал. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
HELPER |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 18.4.2005 Репутация: -2 Всего: -2 |
Void, я про саму библиотеку, а не отом, что она делает...., хотя раз она определаят операторы << >> то может быть дело в порядке вычисления - слева на право или наоборот? |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
А я про что... ![]() -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
HELPER |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 18.4.2005 Репутация: -2 Всего: -2 |
...
![]()
но результат 30 30 вообще не понятен... |
|||
|
||||
Alastis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 15.11.2004 Где: Казахстан, Астана Репутация: 4 Всего: 10 |
-------------------- Прости, что я говорю, когда ты меня перебиваешь. |
|||
|
||||
Fantasist |
|
||||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Да в общем-то компилятору пофиг, объявленна перегружен ли оператор пользователем или нет. По сути, оператор<< уже перегружен для ostream. Ассоциативность для оператора<< стандартом таки опредленна, поэтому конструкция типа
Вполне валидна и выдает предсказуемый результат. (так же как и a<<b<<2). То, что явлется здесь undefined behavior - это, как обычно, изменение значение переменной. Так как sequence point'ов в этом выражении нет, то его составляющие компоненты могут вычислятся в произвольном поряедке. В принципе, компилятор может вначале вычислить a и b, а потом их вывести. А может вычислить а, вывести а, вычислить b, выветси b, вывести а. -------------------- Волны гасят ветер... |
||||
|
|||||
kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 2 Всего: 6 |
Так, не в тему:
может сделать опрос на форуме, у кого какие результаты выдает на каком компиляторе? ![]() -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
chipset |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Давай ![]() --------------------
|
||||
|
|||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
Это UB.
Это ведь тоже самое что и:
по сути ![]() Это сообщение отредактировал(а) Rickert - 28.6.2007, 06:40 -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
korbian |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 336 Регистрация: 20.2.2007 Где: Penza Репутация: 2 Всего: 14 |
minGW 3.4.2
30 31 -------------------- korbian © |
|||
|
||||
FiMa1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 23.9.2006 Репутация: 5 Всего: 6 |
Borland C++ Builder 6.0
29 30 (и для 'Full debug' и для 'Release') MS Visual Studio 2005 Professinal Editition (#include <iostream> вместо "iostream.h") 29 30 ('Debug') 30 30 ('Release') Это сообщение отредактировал(а) FiMa1 - 28.6.2007, 10:59 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
GСС 4.1.2 во всех режимах оптимизации выдал 29 30.
|
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Некрофилы
![]() -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Rickert,
korbian, FiMa1, bsa, молодцы. Хорошую тему подняли. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Я не поднимал, я только ответил...
![]() |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
korbian |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 336 Регистрация: 20.2.2007 Где: Penza Репутация: 2 Всего: 14 |
Void,
JackYF, на дату начала дискуса я и не обратил внимания. ![]() -------------------- korbian © |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |