Побитовый или гарантирует порядок оценки? - PullRequest
15 голосов
/ 21 мая 2011

Скажите, у меня есть этот код:

unsigned int func1();
unsigned int func2();
unsigned int func3();

unsigned int x = func1() | func2() | func3();

Гарантирует ли C ++, что сначала будет вызываться func1 (), затем func2 (), а затем func3 ()?

Или компилятору разрешено вызывать функции в любом порядке?

Кроме того, разрешено ли компилятору реализовывать оптимизацию короткого замыкания здесь, если он этого хочет? (например, если func1 () вернул ~ 0, может ли компилятор не беспокоиться о вызове func2 () или func3 (), потому что он знает, что их возвращаемые значения не могут повлиять на значение, присвоенное x?)

Ответы [ 2 ]

18 голосов
/ 21 мая 2011

Нет, нет никакой гарантии, в каком порядке будут вызываться функции. В отличие от ||, | не подразумевает точку последовательности.

Все функции в выражении должны вызываться, если только реализация не может определить, что они не имеют побочных эффектов, и не может определить результат выражения без фактического вызова одной из функций. Реализация может делать это в соответствии с правилом «как если бы», которое позволяет реализации выполнять любую оптимизацию, которая не может быть обнаружена или обнаружена соответствующей программой.

13 голосов
/ 21 мая 2011

Это не будет короткого замыкания. Может выполняться не по порядку.

"Направление оценки не влияет на результаты выражений, которые включают более одного оператора умножения (*), сложения (+) или двоичного (& | ^) на одном уровне."

...