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

Вывод в cout

22.03.2013, 22:39. Показов 1715. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru