Несколько IF с одинаковым доходом - PullRequest
6 голосов
/ 28 июня 2011

Я видел некоторый код, который выглядит следующим образом:

if (a) return false;
if (b) return false;
if (c) return false;
return true;

Есть ли разница в производительности между вышеприведенным и

if (a || b || c) return false;
else return true;

В общем, что было бы предпочтительнымдело с этим?Может быть, без другого в моем втором примере?

РЕДАКТИРОВАТЬ: Кажется, многие были введены в заблуждение из-за того, что я возвращаю истину или ложь и предлагаю вернуться! (A || b || c).Это не то, что я хотел спросить.Представьте, что вместо того, чтобы возвращать true или false, я хочу вернуть «Yes» или «No», или 23423 или 3.

Ответы [ 5 ]

5 голосов
/ 28 июня 2011

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

Если 3 теста короткие, то return !(a||b||c); вполне разумно

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

4 голосов
/ 28 июня 2011

Все сводится к тому, как компилятор компилирует код. Для всех практических целей они идентичны. (При условии, что вы используете коротко замкнутый ИЛИ "||")

1 голос
/ 28 июня 2011

Вкратце: в коде нет существенных различий, и вы могли бы далее сократить код, написав его как return !(a || b || c);


Если ваши условия действительно простыНапример, if (fata_is_invalid || login_failed) тогда вы можете объединить их все в одну строку, как вы предлагали.

Иногда вы увидите просто огромные условия, и в этом случае предпочтительнее разбить их на более мелкие куски (либочерез несколько операторов if или путем переформатирования кода).В любом случае, это просто удобочитаемость - используйте любой метод, который вы предпочитаете (или какой бы то ни было в вашем «руководстве по стилю»).почти) идентичный код для всего, что вы пишете в этих случаях.

0 голосов
/ 28 июня 2011

Разделяйте ifs и используя || оператор не обязательно идентичен! Если какие-либо из a, b или c являются пользовательскими типами и перегрузка либо || или оператор преобразования в любое целое число или тип указателя, тогда эти две конструкции могут дать разные результаты!

0 голосов
/ 28 июня 2011

&&, || а также ? операторы короткого замыкания в C ++, что означает, что второй аргумент вычисляется, только если первый аргумент не определяет значение выражения.

Это означает, что вы можете просто написать пример кода:

return !(a || b || c);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...