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

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

18.03.2014, 12:36. Показов 2065. Ответов 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
2222 / 1424 / 419
Регистрация: 16.05.2013
Сообщений: 3,639
Записей в блоге: 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 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru