Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
#1

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

18.03.2014, 12:36. Просмотров 395. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2014, 12:36     странный порядок вывода cout
Посмотрите здесь:

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
18.03.2014, 12:48     странный порядок вывода cout #2
Век воли не видать. У меня все работает как положенно.
Миниатюры
странный порядок вывода cout  
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
18.03.2014, 12:56     странный порядок вывода cout #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от metaluga145 Посмотреть сообщение
cout << a.pop() << endl << a.pop() << endl << a.pop();
Unspecified behavior
http://alenacpp.blogspot.ru/2005/11/...ce-points.html
John Prick
773 / 706 / 129
Регистрация: 27.07.2012
Сообщений: 2,022
Завершенные тесты: 3
18.03.2014, 12:58     странный порядок вывода cout #4
Я так подозреваю, что проблема в использовании std::cout и std::cerr.
Progers
New to C++
83 / 44 / 5
Регистрация: 14.01.2013
Сообщений: 258
18.03.2014, 12:58     странный порядок вывода cout #5
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;
Так будет выводить в правильном порядке.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
18.03.2014, 14:16  [ТС]     странный порядок вывода cout #6
Progers, не, ну спасибо, конечно, но так и я умею делать) вопрос не стоял как сделать, чтобы все было правильно, а почему оно неправильно работает))
Цитата Сообщение от 0x10 Посмотреть сообщение
не, ну это, конечно, круто, но после возврата из функции есть точка следования. а это означает, что в поток должно было попасть 11, 12 и только за тем -1. то есть, и вывод должен быть такой, как ожидалось. здесь нету неопределенного поведения, оно есть только в месте вызова потока cerr.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2014, 14:52     странный порядок вывода cout
Еще ссылки по теме:

Нюансы ввода/вывода в Си и C++ (функция printf() и объект std::cout) - C++
Добрый день. Интересует следующий вопрос: каким именно образом работает команда форматирование &quot;%i&quot; в printf. В манах написано что...

Расчитать значения переменных y и z по заданным формулам, используя для ввода/вывода cin и cout - C++
Расчитать значения переменных y и z по заданным формулам . Для ввода/вывод использовать объекты cin и cout. Определить разность между...

Расчитать значения переменных y и z по заданным формулам, используя для ввода/вывода cin и cout - C++
Расчитать значения переменных y и z по заданным формулам (табл. 1). Для ввода/вывода использовать объекты cin и cout. Определить...

Файлы (порядок вывода предложений) - C++
Помогите пожалуста сделать программу( Мне нужно чтобы был текстовый файл(в нем должно быть четное количество предложений, например 8 или...


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

Или воспользуйтесь поиском по форуму:
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
18.03.2014, 14:52     странный порядок вывода cout #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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. И т. д. по мере накручивания вложенных вызовов.
Yandex
Объявления
18.03.2014, 14:52     странный порядок вывода cout
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru