Помогите? Почему вывод такой? - PullRequest
3 голосов
/ 13 мая 2011
#include <iostream>
using namespace std;

int a = 8;

int g()
{
    a++; 
    return a - 1;
}

int f()
{
    a++;
    return a;
}

int main()
{
    cout << g() << " " << f() << " " << g() + f() << endl;
    system("PAUSE");
    return 0;
}

Выход "11 11 18"

Ответы [ 6 ]

9 голосов
/ 13 мая 2011

Порядок оценки функций в C ++ не определен.В коде:

cout << g() << " " << f() << " " << g() + f() << endl;

Компилятор может выдать код для вызова f (), f (), g (), g () и затем добавить результаты.Или это может сделать что-то еще.

Это не является чем-то конкретным для использования с cout, кстати - если вы напишите код, подобный этому:

x = a() + b() * c();

Нет никакой гарантии относительно того, в какой порядок будут вызваны a, b и c.Это одна из многих причин, по которым глобальные переменные являются плохой вещью - вы часто не можете предсказать, как будут вызываться функции, которые их изменяют.

4 голосов
/ 13 мая 2011

Для этого конкретного результата сначала оценивается g() + f(), что в результате приводит к увеличению a до 10 и получению результата 18.Это имеет место независимо от того, выполняется ли сначала бит g() или f() этой суммы.Выполнение g() сначала дает 8+10, иначе это 9+9.

Затем f() оценивается, устанавливая a в 11 и возвращая 11.

Затемg() оценивается, устанавливая a в 12 и возвращая 11.

Другими словами, вызывает самых правых битов cout первого ипродолжая влево.

Теперь вы заметите фразу "для этого конкретного результата" в моих рассуждениях выше.Является ли это обязательным требованием стандарта, я точно не знаю (имеется в виду, что в данный момент я не могу его искать), но я очень сильно сомневаюсь в этом, основываясь на опыте.

Итак,хотя он выводит элементы в правильном порядке, побочные эффекты могут различаться в зависимости от большого количества вещей.Это одна из причин, почему глобальные переменные (или, вернее, побочные эффекты на них) редко бывают хорошей идеей, и вам, вероятно, следует переосмыслить их использование: -)

4 голосов
/ 13 мая 2011

Это связано с порядком оценки.В этом случае сначала вычисляется g () + f (), что дает 8 + 10 = 18. После этого оценивается a == 10 и f (), что дает 11 и устанавливает a в 11 и т. Д.

3 голосов
/ 13 мая 2011

Порядок выполнения не гарантируется, если в выражении нет точки последовательности .Если вы хотите узнать порядок здесь, вы должны разбить его на отдельные утверждения.

cout << g() << " ";
cout << f() << " ";
int temp = g();
temp += f();
cout << temp << endl;
2 голосов
/ 13 мая 2011

a является глобальной переменной и, таким образом, доступна всем.
Кроме того, оператор
g () + f () = 8 + 10 = 18 (после 10)
f () = 11 и а равно 11
г () = 11 и а равно 12

0 голосов
/ 13 мая 2011
cout << g() << " " << f() << " " << g() + f() << endl;

так же, как

cout.operator<<(operator<<(operator<<(operator<<(operator<<(operator<<(endl), g() + f()), " "), f()), " "), g());

Порядок вызова функций - вот почему это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...