Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 03.03.2013
Сообщений: 27

Вывод в cout

22.03.2013, 22:39. Показов 1699. Ответов 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;
, то сначала последний элемент, а потом первый? В чём разница?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.03.2013, 22:39
Ответы с готовыми решениями:

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

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

Оператор cout << вывод значения
Добрый день! Решая тесты по С++, столкнулась с такими заданиями: 1) Что будет напечатано, после выполнения этого кода: cout &lt;&lt;...

5
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
22.03.2013, 23:10
Цитата Сообщение от snorlax212 Посмотреть сообщение
сначала последний элемент, а потом первый? В чём разница?
Выражение анализируется с конца. В стек попадают сначала последние аргументы. А потом они снимаются с верхушки стека. То. что у тебя происходит, называется побочный эффект Если тебе эти слова ничего не говорят, постарайся избегать подобных выражений. Если все-таки интересно, посмотри как перегружена операция "<<" в соответствующем классе и узнай, как происходит передача параметров в функцию на ассемблерном уровне.
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
22.03.2013, 23:13
Недавно обсуждалось. В общем это UB (undefined behavior), т.е. на другом компиляторе может работать так, как задумывалось. Но уповать на компилятор не стОит, поэтому подобных вещей лучше избегать.
1
2 / 2 / 0
Регистрация: 03.03.2013
Сообщений: 27
22.03.2013, 23:20  [ТС]
Байт, Kastaneda, понял, спасибо.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
22.03.2013, 23:29
Цитата Сообщение от Kastaneda Посмотреть сообщение
В общем это UB (undefined behavior), т.е. на другом компиляторе может работать так, как задумывалось.
Абсолютной уверенности нет, я не большой знаток стандартов, но мне кажется, что засовывание параметров в стек справа налево есть именно фишка языка Си со времен K&R. Что позволяет естественно работать с функциями с переменным числом параметров типа printf. И если не предпринимать специальных телодвижений типа fastcall, _PASCAL_, то во всех Си и Си++ компиляторах это так и будет происходить. Если я не прав, пусть товарищи меня поправят.
Цитата Сообщение от Kastaneda Посмотреть сообщение
подобных вещей лучше избегать.
А вот тут я полностью с вами согласен
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
23.03.2013, 00:02
Цитата Сообщение от Байт Посмотреть сообщение
что засовывание параметров в стек справа налево
Не, тут дело не в этом. Дело в том, что нельзя с уверенностью сказать какой параметр функции будет вычислен первым.
Например
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 компилирует из этого код с ожидаемым поведением.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.03.2013, 00:02
Помогаю со студенческими работами здесь

Форматный вывод cout /printf
Вот код, как сделать вывод через cout , а не через printf? Помогите пожалуйста, заранее спасибо :) #include &lt;stdio.h&gt; #include...

Форматный вывод через cout
Как можно написать данную программу с помощью потока cout? #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include...

Вывод адреса символа в cout
Здравствуйте. Подскажите пожалуйста в чём может быть проблема . #include&lt;iostream&gt; int main() { char z = 'M'; char* symbol =...

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru