Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386

Странный вывод оператором cout

17.06.2015, 14:12. Показов 1785. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Написал код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
int     main()
{
    int*    p = 0, a = 0,status=11;
 
    std::cout   <<  status
        <<  std::endl
                <<  "type of a is "
                <<  abi::__cxa_demangle(typeid(a).name(), 0, 0, &status)
        <<  std::endl
                <<  status
        <<  std::endl
                <<  "type of p is "
                <<  abi::__cxa_demangle(typeid(p).name(), 0, 0, &status)
        <<  std::endl
                <<  status
        <<  std::endl;
 
    return 0;
}
В результате на экране оказалось следующее:
0
type of a is int
0
type of p is int*
11
Пуще всего в результате меня поразил первый ноль (ожидал увидеть 11). Я закомментировал 11 и 16 строки вышеприведённого кода и получил трижды 11. Сделал вывод, что дело в функции __cxa_demangle(). К сожалению, в интернете ничего по этой функции найти мне не удалось. Может кто-нибудь сказать, где можно почитать про эту функцию и почему такой странный вывод наблюдается, если эту функцию вызывать?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.06.2015, 14:12
Ответы с готовыми решениями:

Странный вывод cout
Здравствуйте. Я обнаружил внезапно, что у меня как-то очень выборочно работает cout. Вод код: #include &lt;iostream&gt; ...

Вывод массива символов оператором cout. Почему он печатает до перевода строки?
Уважаемые знатоки прошу помочь в маленькой проблеме. В общем дело такое. Я из текстоввого файла читаю всё его содержимое в массив...

Исправить простой код с оператором cout
Добрый день! Помогите пожалуйста исправить ошибки в этом коде. Изучаю С++ совсем недавно и ещё не все ошибки могу разобрать, т.к....

10
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
17.06.2015, 14:30
Лучший ответ Сообщение было отмечено ronaldo как решение

Решение

У Вас в коде UB. В каком порядке будут произведены вызовы функции abi::__cxa_demangle неизвестно. Ну и собственно, значение status млжет быть запомнено еще до того, как функция его изменит.

Разделите вывод на несколько выражений (как раз по std::endl) и увидите разницу.

Что касается функции, то вот информация о ней https://gcc.gnu.org/onlinedocs... 01696.html
1
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386
17.06.2015, 14:49  [ТС]
Croessmah, спасибо за ответ.
Честно говоря, мне можно было бы по данной Вами ссылке и не проходить - если я не знаю даже, что оператор cout выполняется справа налево, то какой мне __cxa_demangle()?
Всё же я прошёл, хотел уточнить - получается, четвёртый параметр выходной? Мы передаём адрес, в который функция записывает значение?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
17.06.2015, 15:05
Да. Записывается 0, в случае успеха или код ошибки. По ссылке есть значения.
1
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386
17.06.2015, 15:16  [ТС]
Побродил по сети - так получается, что оператор cout выполняется не справа налево, а как угодно компилятору?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
17.06.2015, 15:33
если я не знаю даже, что оператор cout выполняется справа налево, то какой мне __cxa_demangle()?
Не справа налево. Дело не в этом. Дело в том, что три вывода одной переменной и два вызова функции её изменяющей находятся в пределах одного выражения. В пределах выражения компилятор может "ходить и оптимизировать" как хочет, если это не вредит самому выражению. Поэтому неизвестно, в каком порядке будут вызваны функции и запомнены значения переменных. Компилятор может, например, поместить куда-нибудь значение переменной status, потом вызвать функции, потом вывести новое значение status, а потом вывести старое запомненное значение переменной status. А может и по другому. В данном случае в выражении гарантируется лишь порядок, в котором будут выведены переменные и результаты функции, но не порядок расчета значений.

Старался попроще объяснить, похоже, не получилось

Добавлено через 15 минут
Просто возьмем пример попроще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int foo( int x )
{
    std::cout << "foo(" << x << ")" << std::endl ;
    return x ;
}
 
int main()
{
    std::cout << foo(1) << foo(2) << std::endl ;
}
В данном случае foo(2) может быть вызвана до foo(1). Гарантируется лишь то, что результат функции foo(1) будет выведен перед выводом результата выполнения функции foo(2). А уж в каком порядке будут вызваны функции (вычислены аргументы выражения) зависит от того, какой код сгенерирует компилятор.

http://ideone.com/GtO6gM
1
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
17.06.2015, 16:34
...
http://alenacpp.blogspot.ru/20... oints.html
1
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
17.06.2015, 16:39
lss, с точками следования теперь засада
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
17.06.2015, 16:44
Смысл разве не остался?
0
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386
17.06.2015, 18:14  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
с точками следования теперь засада
Не понимаю я современный сленг... Что значит "засада"?
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
17.06.2015, 18:43
Croessmah, наверное, это имел в виду:
Цитата Сообщение от Tulosba Посмотреть сообщение
lss, кстати, термина "sequence point" начиная с c++11 уже нет. Заменили на отношение "sequenced before" (1.9/13)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.06.2015, 18:43
Помогаю со студенческими работами здесь

странный порядок вывода cout
Доброго времени суток. Есть шаблонный класс stack, и небольшая тестовая программка. Ожидаемый вывод после выполнения программы немного не...

Вывод в cout
Добрый вечер. Есть код: #include &lt;iostream&gt; using namespace std; class queue { int q; int sloc, rloc; public: void...

Вывод string в cout
Доброго времени суток, возникла проблема с описанием функции show(). //bank.h #include &lt;cstring&gt; class Bank { private: ...

Странный вывод
#include &lt;iostream&gt; #include &quot;conio.h&quot; typedef const double* (*p_fun)(const double *, int); const double * f1(const double av, int n)...

Странный вывод
Файл text.txt: Файл myfile.cpp: #include &lt;fstream&gt; #include &lt;string&gt; #include&lt;iostream&gt; using namespace std; int main(int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru