using namespace std;
int foo1(int &n);
int foo2(int n);
int main() {
int n1, n2;
cout << foo1(n1) << n1 << foo2(n2) << endl;
}
int foo1(int &n) {
n = 3;
return 1;
}
int foo2(int n) {
return 2;
}
и я получаю вывод 1 (trash val) 2
.
Почему значение n1
не изменяется? foo1()
работает быстрее, чем cout << n1;
?
Когда значение ссылки var изменено?
Я предполагаю, что вы используете MSVC версии С++ 14 или старше, так как однажды я заметил ту же проблему, и оказалось, что порядок вычислений в одном предложении не может быть гарантирован до С++ 17.
Отвечает ли это на ваш вопрос? Порядок оценки аргументов с помощью std::cout И взгляните на второй ответ там. До С++ 17 поведение не указано.
Спасибо. Я использую С++ 11, и я понимаю! :)
Этот
cout << foo1(n1)<<n1<<foo2(n2)<<2ndl;
на самом деле решает
operator<<(operator<<(operator<<(operator<<(cout, foo(n1)), n1), foo2(n2)), endl);
Порядок оценки аргументов стандартом не определен. Это зависит от реализации. Так вот
operator<<(operator<<(cout, foo(n1)), n1)
любой из них может быть оценен в первую очередь. А в вашем случае получается n1
первое место, а потом operator<<(cout, foo(n1))
Пожалуйста, укажите, над каким языковым стандартом вы работаете:
c++17
или... ?