Операторы условного возврата C/С++

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

foo() {
   if (a < b) {
       return 0;  // bail, since condition is met
   } else {
       // lots of calculations in this block
   }
   return 1;
}

Мой вопрос: плохо ли иметь несколько операторов возврата? Это плохая практика? Есть ли лучшие методы? Означает ли MISRA что-нибудь об этом?

ПРИМЕЧАНИЕ. Этот вопрос относится к Embedded Systems, имеет отношение к MISRA не только C/С++

Спасибо...

Ответ 1

Для MISRA требуется один оператор возврата:

(MISRA, правило 14.7: требуется) "Функция должна иметь одну точку выхода в конце функции"

Теперь, лично я не думаю, что это хорошее правило. Минимизируйте количество операторов return, но используйте оператор return, когда он улучшает читаемость вашего кода.

Например оговорки охраны могут сделать ваш код более понятным и понятным.

Я предлагаю вам прочитать эту статью о duffing (написание кода сверху вниз):

Ответ 2

Я бы написал так, потому что else избыточен:

   if (a < b) {
       return 0;  // bail, since condition is met
   }
   // lots of calculations in this block
   return 1;

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

Однако в рекурсивной функции, например, очень удобно помещать ваши "базовые случаи" в качестве операторов возврата в начале функции.

Например, рассмотрим факториал:

int fact(int x) {
  // base cases
  if (x == 0 || x == 1)
    return 1;

  // recursive call
  return x * fact(x-1);
}

Вы также можете записать его так:

int fact(int x) {
  int ret = 0;
  if (x == 0 || x == 1)
    ret = 1;
  else
    ret = x * fact(x-1);
  return ret;
}

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

Это действительно сводится к любым стандартам, которым вы должны следовать и к личным предпочтениям.

Ответ 3

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

foo() {
   int results = 0;  // good practice to initialize
   if (a < b) {
       results = 0;  // redundant, likely optimized out
   } else {
       // lots of calculations in this block
       results = 1;
   }
   return results;
}

Ответ 4

Несколько операторов return корректно действуют в C/С++. Но убедитесь, что хотя бы одно из операторов return всегда выполняется. Следующая функция неверна,

int foo(int x)
{
  if(x>0)
  {
    return 1;
  }
  else if(x==0)
  {
    return 0;
  }
  else
  {
    // No return in this block
  }
}

таких ситуаций следует избегать в C/С++.

Ответ 5

Наличие нескольких операторов возврата в функции вполне приемлемо. Фактически, наличие нескольких операторов возврата в функции, подобной приведенной выше, может обеспечить улучшение производительности и удобочитаемости. Например, вам не нужен блок else в приведенной выше функции, потому что вы возвращаетесь из функции, если условие выполнено.

Просто убедитесь, что если ваша функция не имеет типа возврата void, то у вас есть оператор return в конце и что все возвращаемые операторы возвращают этот тип. Например, если ваша функция объявлена ​​следующим образом:

int foo ();

Затем все ваши операторы return должны возвращать целые числа, и вы должны возвращать целое число в конце, независимо от того, что. Но если ваша функция имеет тип возврата типа void, например:

void foo ();

Затем, если вы достигнете конца функции и не имеете ключевого слова return, функция автоматически вернется.