Делает побитовую или гарантировать оценку упорядочения?
-
08-09-2020 - |
Вопрос
сказать, у меня есть этот код:
unsigned int func1();
unsigned int func2();
unsigned int func3();
unsigned int x = func1() | func2() | func3();
.
Гарантия C ++, что Func1 () будет называться первым, затем Func2 (), а затем Func3 ()?
или компилятор разрешено вызывать функции в любом порядке, что ощущается?
Также есть компилятор, позволяющий реализовать оптимизацию короткого замыкания здесь, если она хочет?(например, если func1 () вернулся ~ 0, может ли компилятор решите не вызывать вызов func2 () или func3 (), потому что он знает, что их возвращаемые значения не могут повлиять на значение, присвоенное x?)
Решение
Нет, нет никакой гарантии, на какой порядок функции будут вызываться. В отличие от ||
, |
не подразумевает точку последовательности.
Все функции в выражении должны быть вызваны, если реализация не может определить, что у них нет побочных эффектов, и он может определить результат выражения, не вызывая одну из функций.Реализация может сделать это под правилом «Как будто», которое позволяет осуществлять любую оптимизацию, которая не может наблюдаться или обнаружена соответствующей программой.
Другие советы
Это не будет коротким цепью.Это может выполнить из строя.
"Направление оценки не влияет на результаты выражений, которые включают в себя более одного размножения (*), добавления (+) или двоичного побитового (& | ^) оператора на одном уровне."