Моя первая мысль, когда я увидел вопрос, была:
int count=0;
if (a)
++count;
if (b)
++count;
if (c)
++count;
return count>=2;
После просмотра других постов, я признаю, что
return (a?1:0)+(b?1:0)+(c?1:0)>=2;
гораздо элегантнее. Интересно, каковы относительные времена выполнения.
В любом случае, я думаю, что такое решение намного лучше, чем решение
return a&b | b&c | a&c;
разнообразие, потому что его легче расширять. Что если позже мы добавим четвертую переменную, которая должна быть проверена? Что если число переменных определяется во время выполнения, и нам передается массив логических значений неизвестного размера? Решение, которое зависит от подсчета, гораздо проще расширить, чем решение, которое зависит от перечисления всех возможных комбинаций. Кроме того, при перечислении всех возможных комбинаций, я подозреваю, что намного легче ошибиться. Например, попробуйте написать код для «любых 3 из 4» и убедитесь, что вы не пропустите ни один, ни один из них. Теперь попробуйте это с "любой 5 из 7".