Использование операторов сравнения вне условий

Например

int f(int a) {
   ...
   return a > 10;
}

считается приемлемым (не легальным, я имею в виду, это "хороший код" ) или всегда должен быть в условном выражении, например,

int f(int a) {
   ...
   if (a > 10)
      return 1;
   else
      return 0;
}

Ответ 1

Было бы приемлемо - если ваш тип возврата был bool.

Ответ 2

Это абсолютно приемлемо! Фактически, Джоэл упомянул об этом в последнем подкасте stackoverflow. Он сказал, что это единственное, что он должен был показать почти каждому программисту, который начинается в Fog Creek.

Ответ 3

return a > 10 ? 1 : 0;

... имеет больше смысла, потому что вы возвращаете int, а не bool.

Ответ 4

Первый случай - отлично, намного лучше второго, ИМХО. В качестве читаемости я лично сделал бы

   return  (a > 10);

но это незначительный нит, и не каждый соглашался.

Ответ 5

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

Ответ 6

Первое для меня гораздо предпочтительнее, поскольку оно более кратким. (И это позволяет избежать нескольких возвратов:)

Ответ 7

Я бы предпочел написать bool f(int);, а первая форма как bool - это тип boolean в С++. Если мне действительно нужно вернуть int, я бы написал что-то вроде

int f(int) {
    ...
    const int res = (i>42) ? 1 : 0;
    return res;
}

Я никогда не понимал, почему люди пишут

if (expr == true)
    mybool = true ; 
else 
    mybool = false;

вместо обычного

mybool = expr;

Булевая алгебра - это инструмент, который любой разработчик должен иметь возможность инстинктивно обрабатывать

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

Ответ 8

Я думаю, что это вполне приемлемо, если вы обеспечите, чтобы вы приложили дополнительные усилия для обеспечения удобочитаемости. Например, я бы удостоверился, что имя метода очень однозначно, и вы используете хорошие имена переменных.

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

Ответ 9

Мало того, что синтаксис на 100% допустим, вы также должны свободно использовать логические выражения вне операторов if, т.е. int x = i && ( j || k ); (или возвращающие значения, подобные этому).

Ответ 10

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

Я думаю, что это вполне приемлемо, когда язык позволяет это, а использование является частью парадигмы этого языка

Ответ 11

Я просто попробовал три разных варианта с GCC:

int one(int x) { return (x > 42) ? 1 : 0; }
int two(int x) { return x > 42; }
int thr(int x) { if (x > 42) return 1; else return 0; }

Как только вы включите некоторую оптимизацию, сгенерированный код для всех из них один и тот же. Поэтому вы должны использовать вариант, который легче всего читать.

Ответ 12

Я обычно делаю первое над последним.