Вызывается функция с оператором "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 является выходом.... это означает, что его поведение варьируется от компилятора к компилятору.