Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

Странное рекурсивное поведение объекта std::cout - C++

09.02.2013, 17:34. Просмотров 896. Ответов 21
Метки нет (Все метки)

Пытался организовать очередь при помощи шаблона и наткнулся на "странное" поведение:
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// Организация очереди при помощи шаблона
 
#include <iostream>
#include <cstdlib>
 
// По умолчанию тип int, размер 100
template <typename QType = int, int size = 100>
class Queue {
    QType a[size];
    int left, right;
 
    public:
    Queue();
    void qput(QType val);
    QType qget();
};
 
template <typename QType, int size>
Queue<QType, size>::Queue()
{
    left = right = 0;
}
 
template <typename QType, int size>
void Queue<QType, size>::qput(QType val)
{
    if (right == size) {
        std::cout << "Queue is full.\n";
        return; 
    }
    a[++right] = val;
}
 
template <typename QType, int size>
QType Queue<QType, size>::qget()
{
    if (left == right) {
        std::cout << "Queue is empty: ";
        return 0;
    }
    return a[++left];
}
 
int main()
{
    Queue<char> a;
 
    a.qput('e');
    a.qput('n');
    a.qput('g');
    a.qput('l');
    a.qput('i');
    a.qput('s');
    a.qput('h');
 
    std::cout << a.qget();
    std::cout << a.qget();
    std::cout << a.qget();
    std::cout << a.qget();
    std::cout << a.qget();
    std::cout << a.qget();
    std::cout << a.qget() << '\n';
 
    // Now queue is empty
    // another one
    a.qput('e');
    a.qput('n');
    a.qput('g');
    a.qput('l');
    a.qput('i');
    a.qput('s');
    a.qput('h');
 
    std::cout << a.qget() << a.qget() << a.qget() << a.qget()
        << a.qget() << a.qget() << a.qget() << '\n';
 
    return 0;
}
Bash
1
2
3
4
ilyuha21st@coldshoot:~/projects$ ./prog
english
hsilgne
ilyuha21st@coldshoot:~/projects$
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2013, 17:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Странное рекурсивное поведение объекта std::cout (C++):

Странное поведение cout после объявления объекта класса - C++
List words; string strg; сin &gt;&gt; strg; сout &lt;&lt; strg; Ничего не выведет, пока в поток вывода не отправится endl или \n. Если...

Операция std::cout для Объекта типа std::string - C++
Кто детально объяснит почему не выводит ? Дает вот так &quot;Отсутствует оператор &quot;&lt;&lt;&quot;, соответствующий этим операндам&quot; void...

Странное поведение операции XOR и std::cin - C++
Объясните, пожалуйста, почему этот код работает правильно: /* Обмен значений двух переменных без использования дополнительной переменной...

Объяснить поведение объекта std::cin в цикле while - C++
#include&lt;iostream&gt; #include&lt;string&gt; #include&lt;cstdlib&gt; #include&lt;windows.h&gt; using namespace std; int main(){ char i; char...

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream - C++
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++ 2005 Express Edition. Образ диска...

В чем разница std::cout и просто cout? - C++
Ребят ,подскажите на простом языке для чайников . В чем разница std::cout и просто cout?

21
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.02.2013, 21:30  [ТС] #16
Цитата Сообщение от go Посмотреть сообщение
Так с стандарте все есть
Я бы с радостью начал изучать стандарт, но на данном этапе нахожу более полезным почитать какого-нибудь автора. А уж потом, когда большинство аспектов и приёмов дойдут до автоматизма, и обычное чтении книг уже не будет вызывать кокой-либо интерес, тогда уже можно будет начать изучать стандарт. Имхо.
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
09.02.2013, 21:52 #17
Цитата Сообщение от go Посмотреть сообщение
http://liveworkspace.org/code/2jD21P$0
go, а теперь для тех, кто сегодня тупит - в чем разница? Всмысле я вижу, что вывод отличается от предыдущего, но разницы в коде беглым взглядом не вижу.

Добавлено через 6 минут
Аааа, вижу снимаю вопрос.
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.02.2013, 22:31  [ТС] #18
Цитата Сообщение от Kastaneda Посмотреть сообщение
Аааа, вижу снимаю вопрос.
Так поделитесь пожалуйста с другими что вы там заметили, я лично скомпилировал этот код у себя на машине и результат как и прежде.
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
09.02.2013, 22:32 #19
Цитата Сообщение от Kastaneda Посмотреть сообщение
но разницы в коде беглым взглядом не вижу.
xtorne21st, А ее там нет. Код я скопировал полностью, только компилятор clang поставил.


xtorne21st, из стандарта С++
Цитата Сообщение от C++
The order of evaluation of arguments is unspecified. All side effects of argument expression evaluations take effect before the function is entered. The order of evaluation of the postfix expression and the argument expression list is unspecified.
Иными словами все зависит от компилятора.
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.02.2013, 22:36  [ТС] #20
единственное в чём разница, так это в компиляторе, clang и gcc с одними и теме же ключами генерирует разный код...

Добавлено через 2 минуты
Цитата Сообщение от go Посмотреть сообщение
The order of evaluation of arguments is unspecified. All side effects of argument expression evaluations take effect before the function is entered. The order of evaluation of the postfix expression and the argument expression list is unspecified.
Это вы с N3242 взяли? Можете указать страничку, пожалуйста

Добавлено через 37 секунд
Цитата Сообщение от go Посмотреть сообщение
Иными словами все зависит от компилятора.
Немножко меня опередили)
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
09.02.2013, 22:54 #21
Цитата Сообщение от xtorne21st Посмотреть сообщение
Это вы с N3242 взяли?
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
N1905
5.2.2 8)
1
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
11.02.2013, 00:47  [ТС] #22
Цитата Сообщение от Kaimi Посмотреть сообщение
И на экране видим 21.
Идея понятна?
Только после всех разъяснений понятна
0
11.02.2013, 00:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2013, 00:47
Привет! Вот еще темы с ответами:

что использовать std::cout или просто using namespace std? - C++
Приветствую! Сейчас учу С++, постигаю азы так сказать. В арсенале две книги - Джефф Кент, &quot;Основы программирования &quot; и Х.М....

Стандартный поток и STL (std::copy to std::cout) - C++
#include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;algorithm&gt; #include &lt;functional&gt; #include &lt;string&gt; using namespace std; ...

Не работает std::cout || std::cin - C++
#include &quot;Account.h&quot; #include &lt;string&gt; #include &lt;iostream&gt; using std::cout; Account :: Account(int startBalance) { ...

Ошибка в std::cout<<std::endl - C++
есть следующая задача: -создать класс множество целых чисел. перегрузить операторы для следующих операций: Ввода/вывода, объединения двух...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Опции темы

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