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

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

Восстановить пароль Регистрация
 
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
18.03.2014, 12:36     странный порядок вывода cout #1
Доброго времени суток. Есть шаблонный класс 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1778 / 1153 / 223
Регистрация: 16.05.2013
Сообщений: 3,041
Записей в блоге: 5
Завершенные тесты: 1
18.03.2014, 12:48     странный порядок вывода cout #2
Век воли не видать. У меня все работает как положенно.
Миниатюры
странный порядок вывода cout  
0x10
2437 / 1609 / 235
Регистрация: 24.11.2012
Сообщений: 3,949
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
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
18.03.2014, 12:58     странный порядок вывода cout #4
Я так подозреваю, что проблема в использовании std::cout и std::cerr.
Progers
New to C++
 Аватар для Progers
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++
C++ Расчитать значения переменных y и z по заданным формулам, используя для ввода/вывода cin и cout
Расчитать значения переменных y и z по заданным формулам, используя для ввода/вывода cin и cout C++
C++ Пользовательский класс Queue: как изменить порядок вывода элементов?
C++ формат вывода cout << hex

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

Или воспользуйтесь поиском по форуму:
0x10
2437 / 1609 / 235
Регистрация: 24.11.2012
Сообщений: 3,949
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
Ответ Создать тему
Опции темы

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