2008-09-26 3 views
10

НапримерИспользование операторов сравнения за пределами условными

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

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

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

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

+3

Я думаю, что Джим означает «тернарный оператор» – ilitirit 2008-09-26 14:06:31

ответ

31

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

+2

Когда я узнал, что не каждый делает это первым способом, я был ошеломлен! Первый способ настолько читабельнее и лаконичен, а второй сложнее понять, потому что одно простое понятие берет четыре строки, а не одну. – 2008-09-26 01:02:10

+0

Где я делал это, если вы сделали это вторым способом, вы потеряли очки на домашнем задании. Это было во вступительном классе (pre major). – hazzen 2008-09-26 02:05:31

+0

Особенно, если тип возврата - bool. Я съеживаюсь, когда вижу что-то вроде: if (a> 1) return true; else return false; – Ferruccio 2008-09-26 04:03:13

4

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

2

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

0

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

1

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

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

37

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

2

Я бы предпочел написать 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; 

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

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

6

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

return (a > 10); 

но это незначительные нит, а не один все будут согласны.

13
return a > 10 ? 1 : 0; 

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

1

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

1

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

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

1

Я просто попытался три различных варианта с 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; } 

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

Смежные вопросы