| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Как работает cout ... |
| Автор: Lamak 12.5.2005, 14:05 | ||
Отвечая на вопрос что напечатает прога
я ответил 30 30 Обьясните почему она печатает другую строку. |
| Автор: Illuminaty 12.5.2005, 14:12 | ||
Видимо, она напечатала 30 31? a++ - Печатает a, увеличивает a на 1 a-- - печатает a+1, уменьшает (a+1) на 1 |
| Автор: AISIN 12.5.2005, 14:25 |
| точно!!! Lamak Вам нужно разобраться с инкрементом и декриментом. |
| Автор: _hunter 12.5.2005, 14:31 |
| на самом деле она печатает 29 30 |
| Автор: HELPER 12.5.2005, 14:37 | ||
| 29 30 а почему так происходит?? ведь а = 30... как а++ = 29?... Добавлено @ 14:38 даже если:
выводит 29 30!!! че ето инкремент не работает... |
| Автор: Illuminaty 12.5.2005, 14:41 | ||
А так "нормально" выводит 30 31. Я уже не знаю что такое "нормально" |
| Автор: Alastis 12.5.2005, 14:43 |
| да... любопытно... 29 30 |
| Автор: Alastis 12.5.2005, 15:08 |
| а ну да, все правильно... вычисление идет справа налево как положено |
| Автор: Illuminaty 12.5.2005, 15:12 | ||
Точно. Браво! |
| Автор: Lamak 12.5.2005, 20:26 |
| Из вышесказаного я понял так , что сначало выполняется a-- и a=29; потом а печатается и оператором а++ получается 30 и печатается. Кажется так. |
| Автор: Void 13.5.2005, 19:28 |
| Э-э, люди, а это случаем не undefined behaviour? (5.4) Долго вчитывался в стандарт: сначала по выражениям, а потом по требованиям к потокам - но истины так и не постиг MSVC 7.1: 30 30 Intel 7.1: 30 31 CBuilder 6: 29 30 |
| Автор: Alastis 13.5.2005, 20:15 | ||
у меня как раз 7.1, а результат 29 30 |
| Автор: Lamak 14.5.2005, 15:02 | ||||
Я разобрался и работает оно не так,а вот как: Компилятор обрабатывая строку
,сначала вычисляет выражения в обратном порядке как положенно и делает это так: - записывает в стек для cout а=30 - вычисляет -- : присваевает а=29 - записывает в стек для cout а=29 - вычисляет ++: присваевает а=30 Потом cout печатает данные из стека т.е. 29 30. |
| Автор: Void 14.5.2005, 19:01 | ||
Вот уж не знаю А вообще, все это не имеет значения: есть факт - три компилятора выдали три разных результата для элементарной конструкции. Значит, что-то в ней не так. |
| Автор: Alastis 16.5.2005, 06:03 |
| а вот это уже действительно любопытно: компилирую в Debug - результат 29 30, в Release - 30 30 |
| Автор: En_t_end 16.5.2005, 06:33 |
| ВЫВОД: Не следует употреблять подобные конструкции. |
| Автор: chipset 16.5.2005, 07:49 |
| А вообще - это довольно undefined behavior, посудите сами: что думать компилятору если << это операция обьявленная юзером. Порядок определения операций не определен стандартом, поэтому следует больше избегать таких операций. |
| Автор: HELPER 16.5.2005, 08:42 | ||||
А у меня норма, в debug, release всегда 29 30, а может дело вообще не в компиляторах??? может дело в самой iostream.h? может в компиляторах:
просто идет не родная библиотека, а модифицированная, например размер h файла: VC++ 3-4 kb BC5.02 36 kb TC 28 kb BC 31 kb Добавлено @ 08:45 Я к чему ето все... Неужели, за веремя существования этой библиотеки в нее не вносили изменений серьезные дяденьки программисты? |
| Автор: Void 16.5.2005, 19:09 | ||||
А при чем тут потоки? Они всего-навсего определяют семантику операторов >> и << - как и в каком порядке вычислять операнды - дело компилятора.
Дык, это часть стандартной библиотеки C++ - стандарт не определяет реализацию, он только выдвигает определенные требования, которым должна соответствовать библиотека - и все. Существует масса реализаций, наиболее популярны те, что получили свое начало в недрах HP и SGI (сколько я знаю, корни у Dinkumware и STLPort все там же). Так вот, я к тому, что стандарт не определяет, как должен вести себя компилятор в такой ситуации - значит это undefined behaviour - значит это зло! P.S. Кстати, а где народ iostream.h в MSVC 7.1 откопал? К счастью, этот deprecated хидер оттуда выкинут и есть только iostream. С ним и тестировал. |
| Автор: HELPER 16.5.2005, 19:49 | ||
Void, я про саму библиотеку, а не отом, что она делает...., хотя раз она определаят операторы << >> то может быть дело в порядке вычисления - слева на право или наоборот? |
| Автор: Void 16.5.2005, 20:50 | ||
А я про что... |
| Автор: HELPER 17.5.2005, 18:16 | ||
...
но результат 30 30 вообще не понятен... |
| Автор: Alastis 17.5.2005, 18:58 | ||
|
| Автор: Fantasist 17.5.2005, 20:08 | ||||
Да в общем-то компилятору пофиг, объявленна перегружен ли оператор пользователем или нет. По сути, оператор<< уже перегружен для ostream. Ассоциативность для оператора<< стандартом таки опредленна, поэтому конструкция типа
Вполне валидна и выдает предсказуемый результат. (так же как и a<<b<<2). То, что явлется здесь undefined behavior - это, как обычно, изменение значение переменной. Так как sequence point'ов в этом выражении нет, то его составляющие компоненты могут вычислятся в произвольном поряедке. В принципе, компилятор может вначале вычислить a и b, а потом их вывести. А может вычислить а, вывести а, вычислить b, выветси b, вывести а. |
| Автор: kometa_triatlon 18.5.2005, 00:36 |
| Так, не в тему: может сделать опрос на форуме, у кого какие результаты выдает на каком компиляторе? |
| Автор: chipset 18.5.2005, 01:23 | ||
Давай |
| Автор: Rickert 28.6.2007, 06:40 | ||
| Это UB. Это ведь тоже самое что и:
по сути |
| Автор: korbian 28.6.2007, 10:44 |
| minGW 3.4.2 30 31 |
| Автор: FiMa1 28.6.2007, 10:57 |
| 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') |
| Автор: bsa 28.6.2007, 11:32 |
| GСС 4.1.2 во всех режимах оптимизации выдал 29 30. |
| Автор: Void 28.6.2007, 11:44 |
| Некрофилы |
| Автор: JackYF 28.6.2007, 12:24 |
| Rickert, korbian, FiMa1, bsa, молодцы. Хорошую тему подняли. |
| Автор: bsa 28.6.2007, 17:30 |
| Я не поднимал, я только ответил... |
| Автор: korbian 29.6.2007, 08:57 |
| Void, JackYF, на дату начала дискуса я и не обратил внимания. |