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

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

Восстановить пароль Регистрация
 
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
19.08.2013, 11:10     std::cout в CodeBlocks неправильно работает? #1
Ассоциативность у 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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 часа слишком много кому понаставил плюсиков ))
alsav22
5282 / 4801 / 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 неправильно работает?
Ответ Создать тему
Опции темы

Текущее время: 00:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru