Использование операторов сравнения вне условных выражений - PullRequest
10 голосов
/ 26 сентября 2008

Например

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

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

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

Ответы [ 12 ]

37 голосов
/ 26 сентября 2008

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

31 голосов
/ 26 сентября 2008

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

13 голосов
/ 26 сентября 2008
return a > 10 ? 1 : 0;

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

6 голосов
/ 26 сентября 2008

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

   return  (a > 10);

но это второстепенная гнида, с которой не все согласны.

4 голосов
/ 26 сентября 2008

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

2 голосов
/ 26 сентября 2008

Я бы лучше написал 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;

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

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

2 голосов
/ 26 сентября 2008

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

1 голос
/ 29 июля 2010

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

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

1 голос
/ 26 сентября 2008

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

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

1 голос
/ 26 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...