10

私は組み込みプログラムに取り組んでおり、条件が意図されていない場合は、できるだけ早く機能から戻りたいと考えています。次のコードがあり、組み込みプログラミングを行っているとします。

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

私の質問は、複数の return ステートメントを持つのは悪いことですか? それは悪い習慣ですか?より良い方法はありますか?MISRAはそれについて何か言いますか?

注: この質問は組み込みシステムに固有のものであり、C/C++ だけでなく MISRA に関係しています。

ありがとう...

4

5 に答える 5

17

MISRA には単一の return ステートメントが必要です。

(MISRA、ルール 14.7 : 必須) 「関数は、関数の最後に単一の出口点を持たなければならない」

さて、個人的には良いルールではないと思います。return ステートメントの数を最小限に抑えますが、コードの可読性が向上する場合は return ステートメントを使用します。

たとえば、ガード句を使用すると、コードがよりクリーンで読みやすくなります。

ダフィング(コードを上から下に書くこと)に関するこの記事を読むことをお勧めします。

于 2013-06-18T19:32:05.033 に答える
4

elseは冗長なので、私はそのように書いたでしょう:

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

経験則があるとは思いませんが、関数が非常に長く、複数の戻り点がある場合、維持と理解が困難になる可能性があります。

ただし、たとえば再帰関数では、関数の先頭に return ステートメントとして「基本ケース」を配置すると非常に便利です。

たとえば、階乗について考えてみましょう。

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;
}

私は最初の方法の方が好きですが、どちらの方法が他の方法よりも優れているという意味ではありません。

それは、従わなければならない基準と個人的な好みにかかっています。

于 2013-06-18T19:33:41.487 に答える
1

悪い習慣だと考える人もいますが、見た目がきれいなコードになる可能性があるため、個人的には問題ありません。次の方法でも実行できます。

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;
}
于 2013-06-18T19:35:19.600 に答える
0

複数の return ステートメントは、C/C++ では完全に有効です。ただし、少なくとも 1 つの return ステートメントが常に実行されるようにしてください。次の関数は正しくありません。

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

このような状況は、C/C++ では避ける必要があります。

于 2013-06-18T19:36:08.517 に答える
0

関数に複数の return ステートメントを含めることは完全に許容されます。実際、上記のような関数に複数の return ステートメントを含めると、パフォーマンスと可読性が向上します。たとえばelse、条件が満たされた場合に関数から戻るため、上記の関数のブロックは必要ありません。

関数の戻り値の型が でない場合はvoid、最後に return ステートメントがあり、すべての return ステートメントがその型を返すことを確認してください。たとえば、関数が次のように宣言されているとします。

int foo ();

次に、すべての return ステートメントは整数を返す必要があり、何があっても最後に整数を返す必要があります。ただし、関数の戻り値の型が void の場合は、次のようになります。

void foo ();

次に、関数の最後に到達し、returnキーワードがない場合、関数は自動的に戻ります。

于 2013-06-18T19:38:03.113 に答える