Да.
Встроенное логическое И (&&
), логическое ИЛИ (||
) и оператор запятой (,
) - это только * случаев, в которых для двоичного оператора C ++ гарантирует, что вычисление будет вычислять левое выражение, а затем (если не короткое замыкание) правое выражение (оператор запятой конечно всегда вычисляет оба операнда, сначала левый, а затем правый).
Обратите также внимание, что запятая между аргументами функции не является оператором запятой, и, следовательно, порядок вычисления аргументов функции не указан и даже хуже: например, в f(g(h()),i())
возможно, что последовательность вызовов будет h,i,g,f
.
Также гарантия на порядок оценки распространяется только на встроенных операторов; если вы переопределите их, то они в основном станут вызовами функций, где порядок оценки аргументов не гарантирован и где короткое замыкание не выполняется.
Другие бинарные операторы не гарантируют порядок вычисления, и, например, одна распространенная ошибка - думать, что в:
std::cout << foo() << bar();
вызов на foo()
гарантированно произойдет до вызова на bar()
... это не верно.
Конечно, порядок вычисления также гарантирован для оператора троичного :?
, где только одно из двух других выражений будет оцениваться после первой оценки условия.
Другим местом, в котором порядок оценки гарантирован (а иногда и удивителен для новичков), являются списки инициализации членов для конструкторов, но в этом случае порядок не тот, что в выражении, но порядок объявления члена в классе .... например:
struct Foo
{
int x, y;
Foo() : y(compute_y()), x(compute_x()) {}
};
в этом случае гарантировано , что вызов compute_x()
будет выполнен ДО вызова compute_y()
, потому что x
предшествует y
в объявлениях членов.