В С ++,
cout << a << b
По ассоциативности оценивается в:
(cout << a) << b
но компилятор может оценивать их в любом порядке.
Т.е., компилятор может сначала оценить b
, затем a
, затем первую <<
операцию и вторую <<
операцию. Это потому, что нет никакой точки последовательности, связанной с <<
Ради простоты рассмотрим следующий код, который эквивалентен:
#include<iostream>
int main()
{
int i = 0;
std::cout<<i<<i++;
return 0;
}
В приведенном выше исходном коде:
std::cout<<i<<i++;
оценивает вызов функции:
operator<<(operator<<(std::cout,i),i++);
В этом вызове функции значение operator<<(std::cout,i)
или i++
, полученное первым, оценивается как Не указано. Т.е.:
operator<<(std::cout,i)
может быть оценен первым или
i++
может быть оценен первым или
Some Magic Ordering реализован компилятором
Учитывая вышеизложенное, нет способа определить этот порядок, и, следовательно, объяснение также невозможно.
Соответствующая цитата из стандарта C ++ 03:
Раздел 1.9
Некоторые другие аспекты и операции абстрактной машины описаны в этом международном стандарте как не указано ( например, порядок вычисления аргументов функции ). Там, где это возможно, этот международный стандарт определяет набор допустимого поведения. Они определяют недетерминированные аспекты абстрактной машины.