На связанной странице ваш номер 1 расширяется следующим образом:
((cout << args₀ << '\n'), ((cout << args₁ << '\n'), (cout << args₂ << '\n')));
Удаление некоторого повторения, чтобы сделать его чище:
args₀, (args₁, args₂)
Для # 2 расширение сводится к:
(args₀, args₁), args₂
Давайте рассмотрим оценку каждого из них.
# 1:
args₀ , (args₁, args₂)
^^^
Подчеркнутая запятая оценивает левую сторону, печатая 1
.Затем оценивается правая сторона, которая оценивает печать args₁
, печать test
, затем печать args₂
, печать 5.6
.
# 2:
(args₀, args₁) , args₂
^^^
Подчеркнутая запятая оценивает левую сторону.Это запускает оценку другой запятой, которая оценивает печать args₀
, печать 1
, затем оценивает печать args₁
, печать test
.Теперь подчеркнутая запятая завершает оценку левой стороны и вычисляет правую сторону, печатая 5.6
.
. Как видите, оба производят одинаковый порядок оценки каждого отдельного аргумента, несмотря на то, что группировка скобок различна.
Обратите внимание, что в общем случае это не всегда так.Некоторые операторы, такие как +
, не имеют гарантированного порядка вычисления, как оператор запятой.Если бы такой оператор использовался вместо запятой для объединения выражений печати, компилятор мог бы в конечном итоге выбрать оценку отдельных аргументов в любом порядке.