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

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

Войти
Регистрация
Восстановить пароль
 
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
#1

std::cout в CodeBlocks неправильно работает? - C++

19.08.2013, 11:10. Просмотров 599. Ответов 5
Метки нет (Все метки)

Ассоциативность у std::cout должна быть слева направо а этот пример в CodeBlocks доказывает противоположное.
Добавляю в конец вектора два элемента 1 2. Потом их вывожу. При выводе должно бы получится 2 1 -1, а в результате все наоборот (-1 1 2)

Ведь такого не может быть. Может быть я что не понимаю

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
class Vector
{
private:
    int ar[100];
    int pos;
 
public:
    Vector();
 
    void Push(int value);
    int Pop();
};
 
Vector::Vector()
{
    pos = 0;
 
    for (int i=0; i<100; ++i)
        ar[i] = 0;
}
 
void Vector::Push(int value)
{
    ar[pos] = value;
    pos++;
}
 
int Vector::Pop()
{
    if (pos == 0)
    {
        std::cout << "Vector empty." << std::endl;
        return -1;
    }
 
    return ar[--pos];
}
 
 
int main()
{
    Vector      v;
 
    v.Push(1);      // v: 1
    v.Push(2);      // v:  1 2
 
    std::cout << v.Pop() << " " << v.Pop() << " " << v.Pop() << std::endl;      // -1 1 2
 
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2013, 11:10     std::cout в CodeBlocks неправильно работает?
Посмотрите здесь:

Неправильно работает cout для чисел типа double и float - C++
Здравствуйте. Скажите, почему эта программа выводит на экран число 2, а не 2.5 ? #include &lt;iostream.h&gt; int main() { double...

Подскажите, как CodeBlocks запустить с флагом -std=c++11 - C++
Я делаю так: Settings-&gt;Compiller-&gt;Global Compiller Settings-&gt;Other Options и там прописываю -std=c++11, но не работает. Кто-то знает что я...

Std::cout<<(new class)->something(); - C++
Всем привет. Допустим есть: #include &lt;iostream&gt; class A{ int i; public: A() = default; //-std=c++0x for gcc...

Не могу осилить std::cout - C++
Подскажите плз, почему у меня может не работать cout и std::cout. Пробую в Dev-C++ 5.11 #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

Почему gcc ругается на std::cout? - C++
Проблема такая: работаю на Mac, установил Xcode, запускаю gcc в командной строке. Имеется элементарная программка: #include...

Std::cout и его перегруженный битшифт - C++
Здравствуйте, я пытаюсь понять, почему этот код не пишет в консоль &quot;Hi&quot;. #include &lt;iostream&gt; #include &lt;conio.h&gt; int main() {...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
19.08.2013, 11:22     std::cout в CodeBlocks неправильно работает? #2
На самом деле, порядок вычисления аргументов не определен стандартом, поэтому он может быть каким угодно, в принципе, в зависимости от компилятора. Это обычный пример unspecified behaviour.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
19.08.2013, 11:35  [ТС]     std::cout в CodeBlocks неправильно работает? #3
fasked, тогда получается, лучше не использовать вот такое:
C++
1
cout << 1 << 2 << 3;
?
а я всегда думал что должно выводится слева направо)
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
19.08.2013, 11:48     std::cout в CodeBlocks неправильно работает? #4
Цитата Сообщение от BigLow Посмотреть сообщение
тогда получается, лучше не использовать вот такое
Здесь как раз таки все вполне определено и корректно, потому что значения аргументов - константы - они заранее вычислены. В первом же примере каждый аргумент не вычислен заранее. То есть, если его переписать следующим образом:
C++
1
2
3
4
int a = v.Pop();
int b = v.Pop();
int c = v.Pop();
std::cout << a << " " << b << " " << c) << std::endl;
То порядок вывода будет именно a-b-c. Опять же, потому что значения аргументов вычислены заранее. Точнее будет сказать, что вычисление аргументов не зависит от порядка. Не стоит путать порядок вывода в консоль и порядка вычисления аргументов оператора/функции.

Еще один пример:
C++
1
2
3
4
int foo() { return 1; }
int bar() { return 2; }
 
std::cout << foo() << bar();
Нельзя точно сказать, какая именно функция (foo или bar) будет вызвана первой, а какая второй. Но зато точно можно сказать, что на консоль будет выведено именно "12".
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
19.08.2013, 13:43  [ТС]     std::cout в CodeBlocks неправильно работает? #5
fasked, спасибо
репутацию пока не могу добавить. за последние 24 часа слишком много кому понаставил плюсиков ))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2013, 15:15     std::cout в CodeBlocks неправильно работает?
Еще ссылки по теме:

Странное рекурсивное поведение объекта std::cout - C++
Пытался организовать очередь при помощи шаблона и наткнулся на &quot;странное&quot; поведение: // Организация очереди при помощи шаблона ...

Вывод адреса по указателю на 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 ...

Как узнать, находится ли std::cout в hex-режиме? - C++
Как узнать, находится ли std::cout в hex-режиме?

Найти причины ошибки: cout не является членом std - C++
Пример из учебника, пишет что cin, cout - необъявленные идентификаторы, пыталась кажый прописать через std:: - пишет что cout не является...

Нюансы ввода/вывода в Си и C++ (функция printf() и объект std::cout) - C++
Добрый день. Интересует следующий вопрос: каким именно образом работает команда форматирование &quot;%i&quot; в printf. В манах написано что...

Написать программу более простым языком (как заменить std::cout на printf? ) - C++
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;iomanip&gt; using namespace std; int main() { int const n = 5; int...


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.08.2013, 15:15     std::cout в CodeBlocks неправильно работает? #6
На эту тему: Точки следования (sequence points)
Yandex
Объявления
19.08.2013, 15:15     std::cout в CodeBlocks неправильно работает?
Ответ Создать тему
Опции темы

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