Например
int f(int a) {
...
return a > 10;
}
считается ли это приемлемым (не законным, я имею в виду, это `` хороший код ''), или он всегда должен быть в условном виде, например
int f(int a) {
...
if (a > 10)
return 1;
else
return 0;
}
Я думаю, Джим означает "тернарный оператор"





Это абсолютно приемлемо! Фактически, Джоэл упомянул об этом в последнем подкасте stackoverflow. Он сказал, что это единственное, что ему нужно было показать почти каждому программисту, начинающему в Fog Creek.
Когда я узнал, что не все делают это первым способом, я был ошеломлен! Первый способ гораздо более читабелен и краток, тогда как второй труднее понять, потому что одна простая концепция занимает четыре строки, а не одну.
Там, где я учился в старших классах, если ты делал это вторым способом, ты терял баллы за домашнее задание. Это было во вводном классе (pre-major).
Особенно, если тип возвращаемого значения - bool. Я съеживаюсь, когда вижу что-то вроде: if (a> 1) return true; иначе вернуть ложь;
hazzen: Значит, ты учился в отличном месте. Я поступил в общественный колледж. Я, наверное, забыл о программировании там больше, чем когда-либо узнал.
Я не вижу в этом ничего плохого. Во всяком случае, он более краткий, и я думаю, что большинство разработчиков со средним опытом предпочтут его.
Первый вариант для меня намного предпочтительнее, так как он более лаконичен. (И это позволяет избежать многократных возвратов :)
Обычно я делаю первое, а не второе.
Я думаю, что это вполне приемлемо при условии, что вы приложите дополнительные усилия для сохранения читабельности. Я хотел бы убедиться, что имя метода очень однозначное и вы используете хорошие имена переменных.
Вторая альтернатива, которую вы предоставили, я думаю, почти хуже, потому что она включает оператор ветвления и несколько операторов возврата, и эти вещи увеличивают сложность метода, в то же время уменьшая его читабельность.
Это было бы приемлемо - если бы ваш возвращаемый тип был 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.
Типа bool не существует в C, но в остальном да.
Верно. Спасибо, Дэвид. Что касается bool и C, разве <stdbool.h> не предоставляет тип bool для C99?
Да, типа того. Похоже, что поддержка bool в C99 - это полная противоположность устареванию - это все еще макрос, но зарезервированный на случай, если он будет обновлен до полного типа, как в C++. opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html говорит больше.
Конечно, я не могу быть единственным, кто определил BOOL, TRUE и FALSE до stdbool.h?
Первый случай вполне хорош, ИМХО намного лучше второго. Что касается читабельности, я бы лично сделал
return (a > 10);
но это мелочь, и не все согласятся с ней.
Я не согласен. Это выглядит так, будто вы думаете, что return - это вызываемая функция.
Только если вы ставите пробелы перед скобками при вызове функций, чего я не делаю.
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; }
Как только вы включите некоторую оптимизацию, сгенерированный код для всех них будет одинаковым. Поэтому вам следует использовать наиболее удобный для чтения вариант.
Учитывая, что функция возвращает int, было бы лучше использовать третичный оператор: return a> 10? 1: 0