Делает побитовую или гарантировать оценку упорядочения?

StackOverflow https://stackoverflow.com/questions/6078542

Вопрос

сказать, у меня есть этот код:

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

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

Гарантия C ++, что Func1 () будет называться первым, затем Func2 (), а затем Func3 ()?

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top