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

Например

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

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

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

Учитывая, что функция возвращает int, было бы лучше использовать третичный оператор: return a> 10? 1: 0

Jim Buck 26.09.2008 05:16

Я думаю, Джим означает "тернарный оператор"

ilitirit 26.09.2008 18:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
2
728
12

Ответы 12

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

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

Chris Charabaruk 26.09.2008 05:02

Там, где я учился в старших классах, если ты делал это вторым способом, ты терял баллы за домашнее задание. Это было во вводном классе (pre-major).

hazzen 26.09.2008 06:05

Особенно, если тип возвращаемого значения - bool. Я съеживаюсь, когда вижу что-то вроде: if (a> 1) return true; иначе вернуть ложь;

Ferruccio 26.09.2008 08:03

hazzen: Значит, ты учился в отличном месте. Я поступил в общественный колледж. Я, наверное, забыл о программировании там больше, чем когда-либо узнал.

Chris Charabaruk 26.09.2008 09:06

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

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

Обычно я делаю первое, а не второе.

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

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

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

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

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

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

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

вместо равнины

mybool = expr;

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

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

Я думаю, вы хотели вернуть res, а не 0.

David Schlosnagle 26.09.2008 04:59

Типа bool не существует в C, но в остальном да.

Chris Charabaruk 26.09.2008 05:03

Верно. Спасибо, Дэвид. Что касается bool и C, разве <stdbool.h> не предоставляет тип bool для C99?

Luc Hermitte 26.09.2008 05:07

Да, типа того. Похоже, что поддержка bool в C99 - это полная противоположность устареванию - это все еще макрос, но зарезервированный на случай, если он будет обновлен до полного типа, как в C++. opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html говорит больше.

Chris Charabaruk 26.09.2008 05:21

Конечно, я не могу быть единственным, кто определил BOOL, TRUE и FALSE до stdbool.h?

Mark Brackett 01.10.2008 07:11

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

   return  (a > 10);

но это мелочь, и не все согласятся с ней.

Я не согласен. Это выглядит так, будто вы думаете, что return - это вызываемая функция.

Trent 26.09.2008 19:26

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

Michael Myers 26.09.2008 23:55

return a > 10 ? 1 : 0;

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

Мало того, что этот синтаксис на 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; }

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

Другие вопросы по теме