Операторы условного возврата 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
, функция автоматически вернется.