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

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

Войти
Регистрация
Восстановить пароль
 
snorlax212
2 / 2 / 0
Регистрация: 03.03.2013
Сообщений: 23
#1

Вывод в cout - C++

22.03.2013, 22:39. Просмотров 1024. Ответов 5
Метки нет (Все метки)

Добрый вечер. Есть код:

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
#include <iostream>
using namespace std;
 
class queue {
    int q[100];
    int sloc, rloc;
public:
    void init();
    void qput(int i);
    int qget();
};
 
void queue::init() {
    rloc = sloc = 0;
}
 
void queue::qput(int i) {
    if (sloc == 100) {
        cout << "Очередь заполнена." << endl;
        return;
    }
    sloc++;
    q[sloc] = i;
}
 
int queue::qget() {
    if (rloc == sloc) {
        cout << "Очередь пуста." << endl;
        return 0;
    }
    rloc++;
    return q[rloc];
}
 
void main() {
    queue a, b;
    a.init(); 
    b.init();
    a.qput(10); 
    b.qput(19); 
    a.qput(20);
    b.qput(1);
    cout << "Содержимое очереди a: ";
    cout << a.qget() << ' ';
    cout << a.qget() << endl;
    cout << "Содержимое очереди b: ";
    cout << b.qget() << ' ';
        cout << b.qget() << endl;
}
Вопрос: почему, когда я пишу вывод элементов очереди в две строки
C++
1
2
cout << a.qget() << ' ';
cout << a.qget() << endl;
, то выводится как надо, по порядку. А если в один поток
C++
1
cout << a.qget() << ' ' << a.qget() << endl;
, то сначала последний элемент, а потом первый? В чём разница?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2013, 22:39     Вывод в cout
Посмотрите здесь:

Вывод string в cout - C++
Доброго времени суток, возникла проблема с описанием функции show(). //bank.h #include &lt;cstring&gt; class Bank { private: ...

Странный вывод 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 - C++
Здравствуйте. Подскажите пожалуйста в чём может быть проблема . #include&lt;iostream&gt; int main() { char z = 'M'; char* symbol =...

Пятнашки не работают. Вывод с cout - C++
Ребят помогите разобрать. Написал. вроде работало. Препод поросил переделать и все посыпалось. По парядку...не работает...

Нужно сделать вывод не через cout - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; class StringsW { private: char...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
Эксперт C
15842 / 10169 / 1522
Регистрация: 24.12.2010
Сообщений: 19,177
22.03.2013, 23:10     Вывод в cout #2
Цитата Сообщение от snorlax212 Посмотреть сообщение
сначала последний элемент, а потом первый? В чём разница?
Выражение анализируется с конца. В стек попадают сначала последние аргументы. А потом они снимаются с верхушки стека. То. что у тебя происходит, называется побочный эффект Если тебе эти слова ничего не говорят, постарайся избегать подобных выражений. Если все-таки интересно, посмотри как перегружена операция "<<" в соответствующем классе и узнай, как происходит передача параметров в функцию на ассемблерном уровне.
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,250
Записей в блоге: 1
Завершенные тесты: 1
22.03.2013, 23:13     Вывод в cout #3
Недавно обсуждалось. В общем это UB (undefined behavior), т.е. на другом компиляторе может работать так, как задумывалось. Но уповать на компилятор не стОит, поэтому подобных вещей лучше избегать.
snorlax212
2 / 2 / 0
Регистрация: 03.03.2013
Сообщений: 23
22.03.2013, 23:20  [ТС]     Вывод в cout #4
Байт, Kastaneda, понял, спасибо.
Байт
Эксперт C
15842 / 10169 / 1522
Регистрация: 24.12.2010
Сообщений: 19,177
22.03.2013, 23:29     Вывод в cout #5
Цитата Сообщение от Kastaneda Посмотреть сообщение
В общем это UB (undefined behavior), т.е. на другом компиляторе может работать так, как задумывалось.
Абсолютной уверенности нет, я не большой знаток стандартов, но мне кажется, что засовывание параметров в стек справа налево есть именно фишка языка Си со времен K&R. Что позволяет естественно работать с функциями с переменным числом параметров типа printf. И если не предпринимать специальных телодвижений типа fastcall, _PASCAL_, то во всех Си и Си++ компиляторах это так и будет происходить. Если я не прав, пусть товарищи меня поправят.
Цитата Сообщение от Kastaneda Посмотреть сообщение
подобных вещей лучше избегать.
А вот тут я полностью с вами согласен
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2013, 00:02     Вывод в cout
Еще ссылки по теме:

Вывод числа с разбитием на разряды (cout) - C++
Добрый время суток! Вот чую зря создавал новую тему но все же... Вот хоть убейте не помню как сделать таким образом что бы: ...

Интересный вывод, инкремент и декремент в cout - C++
Привет. Вот есть след. код: int i = 0; std::cout &lt;&lt; i &lt;&lt; &quot; &quot; &lt;&lt; ++i &lt;&lt; std::endl; неожиданный вывод, но понять можно. Но вот этот я...

Вывод элементов структуры через cout - C++
Здравствуйте! Подскажите, почему в моём простом примере при попытке вывести элементы структуры через cout я не получаю ожидаемый...

Вывод адреса по указателю на char в std::cout - C++
Есть такая вот функция. void Char(char type){ char c,*vc=&amp;c; cout&lt;&lt;setw(8); cin&gt;&gt;c; cout&lt;&lt;type &lt;&lt;setw(8)&lt;&lt;c &lt;&lt;setw(11)&lt;&lt;hex&lt;&lt;c ...


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

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,250
Записей в блоге: 1
Завершенные тесты: 1
23.03.2013, 00:02     Вывод в cout #6
Цитата Сообщение от Байт Посмотреть сообщение
что засовывание параметров в стек справа налево
Не, тут дело не в этом. Дело в том, что нельзя с уверенностью сказать какой параметр функции будет вычислен первым.
Например
C++
1
2
3
4
5
6
int i = 0;
int f1() {return i++;}
int f2() {return i++;}
int func(int a, int b) {}
 
func (f1(), f2()); // вызов
здесь нельзя утвержать, что f1() вызовется раньше f2(), поэтому аргументы func могут отличаться в зависимости от компилятора.

Тут тоже самое, вот этот код
C++
1
cout << a.qget() << ' ' << a.qget() << endl;
на самом деле выглядет так
C++
1
operator << (operator << (operator << (operator << (cout, a.qget()), ' '), a.qget()), endl);// надеюсь со скобками не напутал)
и здесь мы можем быть уверены только в порядке вызова операторов и в том, что к моменту из вызова аргументы будут вычислены. Но в каком порядке будут вычислятся аргументы мы сказать не можем, т.е. какой из qget() когда будет вызван - хз.

clang компилирует из этого код с ожидаемым поведением.
Yandex
Объявления
23.03.2013, 00:02     Вывод в cout
Ответ Создать тему
Опции темы

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