Есть ли определенный порядок оценки для & = и | =? - PullRequest
7 голосов
/ 30 августа 2009

Если у вас есть функция C, которая возвращает целое число, вы могли бы написать следующее утверждение:

MyInt &= MyFunc();

... где мы используем побитовый оператор И.

Вопрос в том, гарантированно ли выполняется MyFunc (), даже если MyInt равен нулю?

Аналогично, если бы мы использовали оператор побитового ИЛИ (| =), всегда ли выполнялся бы MyFunc (), даже если для MyInt были установлены все единицы?

Другими словами: разрешено ли ленивое вычисление в C для побитовых операторов?

Ответы [ 2 ]

8 голосов
/ 30 августа 2009

Нет. Побитовые операторы не закорочены. MyFunc() выполнение гарантируется независимо от значения MyInt.

1 голос
/ 30 августа 2009
MyInt &= MyFunc();

эквивалентно:

MyInt = MyInt & MyFunc();

Язык утверждает, что оператор & не закорочен. Тем не мение, оптимизатор может сгенерировать код, чтобы не вызывать функцию, если MyInt был равен нулю и был уверен, что функция не имеет побочных эффектов. Я сомневаюсь, что какие-либо компиляторы делают это на самом деле, так как тест во время выполнения, вероятно, делает его пессимизацией.

...