Почему этот код на С++ выводит результат?

Это код C++:

#include<iostream>
using namespace std;


int a=8;

int fun(int &a)
{
    a=a*a;
    return a;
}

int main()
{

    cout << a << endl \
        << fun(a) << endl \
        << a << endl;
        return 0;
}

зачем он выводит:

64 64 8

ассоциативность оператора << слева направо, поэтому почему бы не выводить 8 64 64?

Имеет ли отношение к точке последовательности и стороне эффекта?

Ответы

Ответ 1

Ассоциативность и порядок оценки - это не одно и то же. Выражение a << b << c эквивалентно (a << b) << c из-за ассоциативности слева направо, но когда дело доходит до порядка оценки, компилятор может сначала оценить c, затем a << b, а также оценить b, прежде чем он примет оценку a. Фактически, он даже может оценивать члены в порядке bca если он хочет, и это может быть просто если он сделает вывод, что такой порядок максимизирует производительность, сводя к минимуму конвейерные киоски, промахи в кеше и т.д.