Приоритет не влияет на порядок оценки (за исключением случаев, когда это необходимо - некоторые подвыражения могут нуждаться в оценке перед другими из-за приоритета).Например, в простом выражении:
a() + b() + c() * d()
, хотя умножение имеет приоритет над сложением, компилятор может выполнять вызовы функций в любом порядке, в котором он хочет, и может вызывать a()
или b()
до или после выполнения умножения.Очевидно, что он должен оценить c()
и d()
, прежде чем выполнить умножение.Если у этих функций есть побочные эффекты (например, изменение и использование глобальных переменных), неопределенный порядок оценки может привести к неожиданным результатам.
Однако для некоторых операторов стандарт предписывает строгий порядок оценки.Это что сказать о ||
логическом или операторе:
В отличие от побитового |оператор, ||оператор гарантирует оценку слева направо;после оценки первого операнда есть точка последовательности.Если первый операнд сравнивается с неравным 0, второй операнд не оценивается.
Таким образом, ||
не только обеспечивает гарантию упорядочения, но и гарантирует, что при определенных условиях второй операнд выигралне может быть вычислено вообще.
(там также указано что-то похожее для &&
- за исключением того, что в этом случае 2-й операнд не оценивается, если первый оценивается как 0. Но в вашем примере,||
стоит первым).
Другие операторы, обеспечивающие некоторую гарантию упорядочения, включают оператор запятой и вызов функции (которая гарантирует, что аргументы были оценены, но не порядок, в котором эти аргументы были оценены).