Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927

странный порядок вывода cout

18.03.2014, 12:36. Показов 2115. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Есть шаблонный класс stack, и небольшая тестовая программка. Ожидаемый вывод после выполнения программы немного не совпадает с действительным выводом. Подскажите, почему так?

ожидаемый выводstack underflow11
12
-1

выводитstack underflow-1
11
12


Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//stack.h
#pragma once
template <class T>
class stack
{
public:
    stack(size_t);
    ~stack();
    void push(T);
    T pop();
    bool isEmpty();
private:
    T *arr;
    size_t max_size;
    size_t size;
};
 
#include "stack.cpp"

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//stack.cpp
#include "stdafx.h"
#include "stack.h"
#include <iostream>
 
 
template<class T>
stack<T>::stack(size_t _max) :max_size(_max), size(0)
{
    arr = new T[max_size];
}
 
 
template<class T>
stack<T>::~stack()
{
}
 
 
template<class T>
void stack<T>::push(T in)
{
    if (size < max_size)
        arr[size++] = in;
    else
        std::cerr << "stack overflow";
}
 
 
template<class T>
T stack<T>::pop()
{
    if (isEmpty())
    {
        std::cerr << "stack underflow";
        return T(-1);
    }
    else
        return arr[--size];
}
 
 
template<class T>
bool stack<T>::isEmpty()
{
    return size == 0;
}

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// program1.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "stack.h"
#include <iostream>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    stack<int> a(10);
    a.push(11);
    a.push(12);
    cout << a.pop() << endl << a.pop() << endl << a.pop();
    system("pause");
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.03.2014, 12:36
Ответы с готовыми решениями:

Странный порядок вывода сообщений на экран
Вот код: #include &lt;iostream&gt; using namespace std; #define SIZE 10 // Объявление класса stack для символов: class stack { ...

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

Странный вывод оператором cout
Доброго времени суток. Написал код: #include &lt;iostream&gt; #include &lt;typeinfo&gt; #include &lt;cxxabi.h&gt; int main() { int* ...

6
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
18.03.2014, 12:48
Век воли не видать. У меня все работает как положенно.
Миниатюры
странный порядок вывода cout  
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.03.2014, 12:56
Лучший ответ Сообщение было отмечено metaluga145 как решение

Решение

Цитата Сообщение от metaluga145 Посмотреть сообщение
cout << a.pop() << endl << a.pop() << endl << a.pop();
Unspecified behavior
http://alenacpp.blogspot.ru/20... oints.html
3
2393 / 1914 / 763
Регистрация: 27.07.2012
Сообщений: 5,559
18.03.2014, 12:58
Я так подозреваю, что проблема в использовании std::cout и std::cerr.
0
New to C++
 Аватар для Progers
83 / 44 / 10
Регистрация: 14.01.2013
Сообщений: 258
18.03.2014, 12:58
metaluga145,
C++
1
cout << a.pop() << endl << a.pop() << endl << a.pop();
Я вчера тоже над этим голову ломал, а оказывается что сначала вызывается последний метод класса то есть:
C++
1
2
3
cout << a.pop() << endl;
cout << a.pop() << endl;
cout << a.pop() << endl;
Так будет выводить в правильном порядке.
0
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
18.03.2014, 14:16  [ТС]
Progers, не, ну спасибо, конечно, но так и я умею делать) вопрос не стоял как сделать, чтобы все было правильно, а почему оно неправильно работает))
Цитата Сообщение от 0x10 Посмотреть сообщение
не, ну это, конечно, круто, но после возврата из функции есть точка следования. а это означает, что в поток должно было попасть 11, 12 и только за тем -1. то есть, и вывод должен быть такой, как ожидалось. здесь нету неопределенного поведения, оно есть только в месте вызова потока cerr.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.03.2014, 14:52
Лучший ответ Сообщение было отмечено metaluga145 как решение

Решение

metaluga145,
C++
1
operator<<(operator<<(operator<<(cout, s.pop()), s.pop()), s.pop())
Не проверял расстановку скобок, не суть.
Порядок вычисления аргументов функции стандартом не определен.
Развоначиваем изнутри:
operator<<(cout, s.pop())
Тут действительно все просто - сделали pop, вернулись, вызвали оператор. А дальше?
operator<<(operator<<(cout, s.pop()), s.pop())
Вот тут уже можно сначала вычислить левый аргумент (вложенный вызов оператора, в котором происходит изменение стека), а можно сначала правый - вызов pop. И т. д. по мере накручивания вложенных вызовов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.03.2014, 14:52
Помогаю со студенческими работами здесь

Правила вывода cout
Вопрос небольшой. (Кому то сейчас вспомнится Прата.) Тема пожалуй заезжена и даже чувствую вину за то, что недогуглил. Но все же: Есть...

формат вывода cout << hex
Все привет, имеется небольшая проблемка, не могу придумать как победить.. cout &lt;&lt; uppercase &lt;&lt; hex &lt;&lt; charcode...

cout, два стека, нет вывода из второго
Перегрузил оператор вывода: ostream&amp; operator&lt;&lt;(ostream &amp;ost, List &amp;list) //Перегрузка оператора вывода { if (list.head != 0) ...

Преобразовать массив цифр в строку для вывода на cout<<
Реализую класс длинных чисел (только+). Числа представляю в виде массиве, где каждый элемент это цифра. Но не могу понять, как его...

Странный порядок вызова конструкторов и передача временного обьекта в функцию в качестве неконстантной ссылки
Есть код //g++ 5.4.0 #include &lt;iostream&gt; struct foo { foo(int){std::cout &lt;&lt; &quot;int ctor&quot; &lt;&lt; std::endl;} foo()...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
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 Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru