Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2010, 11:26   #1
jammer77
Пользователь
 
Регистрация: 02.06.2010
Сообщений: 16
По умолчанию непонятное поведение cout

Не могу понять поведение cout.

В данном листинге пример работы с очередью. Но cout выводит значения в обратном порядке. А если сделать так:

Код:
cout<<q1.pop()<<",";
cout<<q1.pop()<<",";
cout<<q1.pop()<<endl;
то все отлично.

Код:
#include "stdafx.h"
#include <iostream>
using namespace std;

///////////////////////////////////////////////////////////////////////////////
class Queue
{
	enum {SIZE = 4};
	int head;
	int tile;
	int queue[SIZE];
public:
	Queue():head(0),tile(-1){};
	void push(int i)
	{
		queue[++tile]= i;
	};
	int pop()
	{
		return queue[head++];
	};
};
///////////////////////////////////////////////////////////////////////////////

int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_ALL, ".1251");
	Queue q1;

	q1.push(1);
	q1.push(2);
	q1.push(3);

	cout<<q1.pop()<<","
		<<q1.pop()<<","
		<<q1.pop()<<endl;


	system("pause");
	return 0;
}
jammer77 вне форума Ответить с цитированием
Старый 01.07.2010, 11:34   #2
Nikita1987
Пользователь
 
Регистрация: 06.04.2010
Сообщений: 30
По умолчанию

Стек так работать и должен! Первый прибыл, последний выбыл!
начинающий программист

Последний раз редактировалось Nikita1987; 01.07.2010 в 11:38.
Nikita1987 вне форума Ответить с цитированием
Старый 01.07.2010, 11:36   #3
jammer77
Пользователь
 
Регистрация: 02.06.2010
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Nikita1987 Посмотреть сообщение
Стек так работать и должен! Первый прибыл, последний отбыл!
это не стек а очередь и работает очередь правильно. вопрос в том что при такой
форме записи
Код:
cout<<q1.pop()<<","
		<<q1.pop()<<","
		<<q1.pop()<<endl;
выводится неправильный результат ее работы. А при такой:
Код:
cout<<q1.pop()<<",";
cout<<q1.pop()<<",";
cout<<q1.pop()<<endl;
правильный.

Последний раз редактировалось jammer77; 01.07.2010 в 11:39.
jammer77 вне форума Ответить с цитированием
Старый 01.07.2010, 11:41   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и работает очередь правильно.
Тогда в чем вопрос?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.07.2010, 11:48   #5
jammer77
Пользователь
 
Регистрация: 02.06.2010
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Тогда в чем вопрос?
Почему когда вызовы метода pop идут в цепочку, cout выводит значения в обратном порядке?
jammer77 вне форума Ответить с цитированием
Старый 01.07.2010, 11:52   #6
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

jammer77, может сейчас глупость скажу, но мне кажется, что это связано с ассоциативностью(или как там это по умному называется), которая в Си идет справа налево. То есть вычисляется q1.pop() с конца. Первым вычисляется тот, который записан последним в строке. То же самое, если вы будете передавать q1.pop() как параметр функции. А cout тут не при чем
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 01.07.2010, 11:52   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Увы, Си при себе нет, но криминального ничего не вижу...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.07.2010, 12:02   #8
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Просто запуск q1.pop() идет справа налево в данном случае.
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 01.07.2010, 12:12   #9
jammer77
Пользователь
 
Регистрация: 02.06.2010
Сообщений: 16
По умолчанию

Как избежать данного неприятного явления?
jammer77 вне форума Ответить с цитированием
Старый 01.07.2010, 12:17   #10
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Код:
cout<<q1.pop()<<","
		<<q1.pop()<<","
		<<q1.pop()<<endl;
Упрощённый пример
Код:
cout << q1.pop() << q1.pop();
это то же, что и
Код:
operator<<(operator<<(cout, q1.pop()), q1.pop());
Стандарт:
http://www.open-std.org/jtc1/sc22/op...html#expr.call
Цитата:
Сообщение от 5.2.2.8
8 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.
Так что не слева направо и не справа налево, а может быть в любом порядке.

Цитата:
Сообщение от jammer77 Посмотреть сообщение
Как избежать данного неприятного явления?
Выводи в цикле. А для STLевских контейнеров можно делать copy в ostream_iterator.
Somebody вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонятное поведение типа J-Max Общие вопросы Delphi 12 10.02.2010 17:15
Вопрос по cout (С++) EniOk Помощь студентам 2 06.12.2009 15:32
Непонятное поведение алгоритма master_root Общие вопросы Delphi 3 11.06.2008 14:32
Непонятное поведение программы на Delphi Kashp Помощь студентам 10 14.12.2007 21:12