2016-12-30 2 views
0

Мне интересно, как дорого объединить логические операторы? Каков наилучший способ их комбинирования?Объединить логические операторы в C

Например: В чем разница между следующими двумя утверждениями с точки зрения оптимизации?

1) if((!x || !y || !z) && (a != b)) 
2) if(!(x && y && z) && (a != b)) 

Я слышал от своих сверстников, что вы должны использовать операцию ANDing чаще, чем операцию ORing. Я новичок в языке C. Пожалуйста, помогите мне понять это. Любой материал или ссылка также будут полезны.

+1

Просто оставьте это в компиляторе. Вероятно, это более эффективно в оптимизации такого материала. – alk

+1

Боте же по закону ДеМоргана. – haccks

+6

Обратите внимание на правило [короткое замыкание] (https://en.wikipedia.org/wiki/Short-circuit_evaluation) для оценки условных выражений в C. Если полное условное выражение может быть известно без оценки дальнейших выражений, это пропускаются. Поэтому будьте осторожны с любыми побочными эффектами, которые могут возникнуть, но не выполняйте (может быть изменение стоимости или вызов функции). Прямой ответ заключается в том, чтобы написать условие самым ясным способом, который будет понятнее всего: когда вы посмотрите на него в следующем году. –

ответ

3

Если этот код не находится в чрезвычайно горячей дорожке вашего кода, всегда выбирайте форму, наиболее логичную для будущего читателя.

Если это является по горячей дорожке, скомпилируйте оба и посмотрите на сборку. Один хороший инструмент, который позволяет вам видеть выход для многих компиляторов и процессоров является godbolt

Вот пример тестирования сценария: fiddle

Как вы можете видеть, количество команд одинаковы.

3

Оба они одинаковы и не должны влиять на характеристики. Они являются эквивалентами друг друга в соответствии с De Morgan's Law.

Смежные вопросы