Вызывается функция с оператором "cout" внутри оператора " cout
я столкнулся с этим довольно расплывчатым поведением, когда возился с кодом, вот пример:
#include <iostream>
using namespace std;
int print(void);
int main(void)
{
cout << "The Lucky " << print() << endl; //This line
return 0;
}
int print(void)
{
cout << "No : ";
return 3;
}
в моем коде, заявление с комментария //This line
предполагается распечатать
The Lucky No : 3
, но вместо этого он был напечатан No : The Lucky 3
. Что вызывает такое поведение? Связано ли это со стандартом C++ или его поведение варьируется от одного компилятора к другому?
3 ответов
порядок вычисления аргументов функции не определен. Ваша строка выглядит так для компилятора:
operator<<(operator<<(operator<<(cout, "The Lucky "), print()), endl);
основной вызов в операторе - это вызов с endl в качестве аргумента. Не указано, будет ли второй аргумент endl вычисляться первым или большим под-выражением:
operator<<(operator<<(cout, "The Lucky "), print())
и разбивая это, не указано, является ли функция print()
вызывается первым, или под-выражение:
operator<<(cout, "The Lucky ")
так, чтобы ответить на ваш вопрос:
что вызывает такое поведение? Связано ли это со стандартом C++ или его поведение варьируется от одного компилятора к другому?
это может варьироваться от компилятора к компилятору.
назовем operator <<
просто operator
.
теперь мы можем писать
cout << "The Lucky"
as
operator(cout, "The Lucky")
результатом этой операции является cout
, и он передается следующей <<
, так что мы можем написать
operator(operator(cout, "The Lucky"), print() )
это вызов функции с двумя параметрами, и стандарт ничего не говорит о порядке их оценки.
так что с некоторыми компиляторами вы действительно можете получить
The Lucky No : 3
в моем компиляторе нет: Lucky 3 является выходом.... это означает, что его поведение варьируется от компилятора к компилятору.