(elide @ Суббота, 20 Августа 2005, 2:45) писал(а):вообще, я считаю, что это глюк gcc и прямое нарушение стандарта.
потому как вызов функции есть точка следования и к его началу все сайд-эффекты от вычисления операндов должны быть закреплены. gcc же, скатина, судя по асмовскому коду, сначала вычисляет аргументы и укладывает их в стек, а потом несколько раз подряд делает call.
естественно печататься они будут в обратном порядке.
IMHO, это не является нарушением стандарта. По крайней мере, в "Справочном руководстве по C++" Страустрапа в главе, посвященной операциям сказано следующее:
Приоритет операций в выражениях такой же, как и порядок главных подразделов в этом разделе [книги], наибольший приоритет у первого. Внутри каждого подраздела операции имеют одинаковый приоритет. В каждом подразделе для рассматриваемых в нем операций определяется их левая или правая ассоциативность (порядок обработки операндов).
В остальных случаях порядок вычисления выражения не определен. Точнее, компилятор волен вычислять подвыражения в том порядке, который он считает более эффективным, даже если подвыражения вызывают побочные эффекты. Порядок возникновения побочных эффектов не определен. Выражения, включающие в себя коммутативные и ассоциативные операции (*, +, &, |, ^), могут быть реорганизованы произвольным образом, даже при наличии скобок; для задания определенного порядка вычисления выражения необходимо использовать явную временную переменную.
Таким образом, определено только то, что ++ выполняется ранее, чем <<, и что несколько подряд идущих << выполняются слева направо. Что касается вопроса о порядке выполнения разных ++ в приведенном выражении, то он действительно не определен и зависит от компилятора.
P.S. Страустрап, конечно, не стандарт, но указанную вещь я встречал и в других местах (например, в своих лекциях по C с первого курса

), так что склонен верить
