Ответ 1
Было бы приемлемо - если ваш тип возврата был bool.
Например
int f(int a) {
...
return a > 10;
}
считается приемлемым (не легальным, я имею в виду, это "хороший код" ) или всегда должен быть в условном выражении, например,
int f(int a) {
...
if (a > 10)
return 1;
else
return 0;
}
Было бы приемлемо - если ваш тип возврата был bool.
Это абсолютно приемлемо! Фактически, Джоэл упомянул об этом в последнем подкасте stackoverflow. Он сказал, что это единственное, что он должен был показать почти каждому программисту, который начинается в Fog Creek.
return a > 10 ? 1 : 0;
... имеет больше смысла, потому что вы возвращаете int, а не bool.
Первый случай - отлично, намного лучше второго, ИМХО. В качестве читаемости я лично сделал бы
return (a > 10);
но это незначительный нит, и не каждый соглашался.
Я не вижу в этом ничего плохого. Если что-нибудь более сжатое, и я думаю, что большинство разработчиков с умеренным опытом предпочли бы это.
Первое для меня гораздо предпочтительнее, поскольку оно более кратким. (И это позволяет избежать нескольких возвратов:)
Я бы предпочел написать 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;
Булевая алгебра - это инструмент, который любой разработчик должен иметь возможность инстинктивно обрабатывать
Кроме того, я бы предпочел определить именованное временное значение, поскольку некоторые отладчики не очень хорошо обрабатывают возвращаемые значения функции.
Я думаю, что это вполне приемлемо, если вы обеспечите, чтобы вы приложили дополнительные усилия для обеспечения удобочитаемости. Например, я бы удостоверился, что имя метода очень однозначно, и вы используете хорошие имена переменных.
Вторая альтернатива, которую вы предоставили, я думаю, почти хуже, потому что она включает в себя инструкцию ветвления и несколько операторов возврата, и эти вещи увеличивают сложность метода, а сами уменьшают его читаемость.
Мало того, что синтаксис на 100% допустим, вы также должны свободно использовать логические выражения вне операторов if, т.е. int x = i && ( j || k );
(или возвращающие значения, подобные этому).
Я думаю, что часть этого имеет отношение к стилю и культуре языка. Первый пример, который вы написали, - это то, что можно было бы ожидать от опытного программиста C. Они гораздо лучше задушили бы себя, чем добавили ненужный блок высказываний.
Я думаю, что это вполне приемлемо, когда язык позволяет это, а использование является частью парадигмы этого языка
Я просто попробовал три разных варианта с 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; }
Как только вы включите некоторую оптимизацию, сгенерированный код для всех из них один и тот же. Поэтому вы должны использовать вариант, который легче всего читать.
Я обычно делаю первое над последним.