2

簡単なはずですが、説明が見つからないようです。以下でこれらのエラーが発生するのはなぜですか。

  1. 到達不能コードが検出されました(result ++で)
  2. WindowsFormsApplication1.Form1.GetResult(int、int):すべてのコードパスが値を返すわけではありません

    private int GetResult(int start, int end)
    {
        for (int result = start; result < end; result++)
        {
            return result;
        } 
    }
    

私を助けてくれる人はいますか?事前にThnx:)

編集: まず第一に、多くの(速い)返信に感謝します。私の愚かな...しかし、私はそれを見ませんでした。

そして申し訳ありませんが、私はそれが何を達成したいのかをもう少し正確にする必要がありました..指定された開始値(int start)から始まり、別の値に達するまで値(result)に1を加算するメソッドが必要です(意図する)。したがって、私が間違えていなければ、整数を開始するために直接追加することもできます。そして、その値を返しますか?

4

14 に答える 14

11

メソッドが型を返しているためint、コンパイラはループ内に入るかどうかを判断できません。

resultが より大きいか等しい場合end、ループ内のステートメントは実行されないため、エラーが発生します。

MSDNから- For ループ

条件式のテストはループの実行前に行われるため、for ステートメントは 0 回以上実行されます。

これにより、「すべてのコード パスが値を返すわけではない」というエラーの背後にある理由がわかります。これは、for ループが0何回も実行された場合、メソッドは何も返さないためです。

「到達不能なコードが検出されました」という警告の場合、その理由はresult++for ブロックの実行後に更新式が実行されるためです。forブロックにreturnステートメントが含まれているため、更新式に到達することはありません

于 2012-08-29T09:01:59.470 に答える
4

なんと賢いコンパイラでしょう!

for (int result = start; result < end; result++)
{
    return result;
} 

...は次と同等です:

int result = start;
while(result < end) {
  return result;
  result++;
}

このコードに入るときに start >= end の場合、while ループの内容は決して実行されません。その場合、プログラム フローはreturnステートメントにヒットしません。すべてのコード パスが値を返すわけではありません

関数に入るときに start < end の場合、プログラム フローはループに入り、returnステートメントにヒットし、メソッドが戻ります。result++ステートメントにヒットすることはできません。到達不能コードが検出されました。


あなたの編集に応じて:

public int getResult(int start, int end) {
   int result = start;
   while(result < end) {
       result++;
   }
   return result;
}

...あなたが説明することを行います。しかし、その結果を得るには無駄な方法です。start=0 で end=1000000 の場合、プログラムは 100 万回ループします。

以下を使用すると、まったく同じ結果がより効率的に得られます。

public int getResult(int start, int end) {
   if(end > start) {
      return end;
   } else {
      return start;
   }
}

あるいは:

public int getResult(int start, int end) {
   return Math.Max(start,end);
}

(ただし、結果がどうなるかはまだ明確ではありませんstart > end)

于 2012-08-29T09:07:32.357 に答える
4

メソッドの開始時には、次の 2 つのケースがあります。

  • ケース:最初のループ実行で常にすぐにstart < end戻ります。resultしたがってresult、インクリメントされることはありません。

  • ケースstart >= end: ループに入ることはないため、そのreturn外側に別のステートメントが必要になります。

于 2012-08-29T09:03:16.470 に答える
4

到達不能であることは明らかですresult++。ループの最初の実行がある場合は、その後に到達しますが、このループの最初の実行で戻り、関数を終了します。

質問の 2 番目の部分については、Habib の回答を参照してください。

于 2012-08-29T09:04:14.800 に答える
2
private int GetResult(int start, int end)
{
    int result = 0;
    for (result = start; result < end; result++)
    {
        return result;
    } 
    return result;
}

このようにして、関数は機能するはずです。

于 2012-08-29T09:03:07.423 に答える
2

for ループを呼び出しています。result=start を設定し、条件が true の場合に比較し、結果を返します。どのようにして result++ に到達するのでしょうか? =到達不能なコードが検出されました (結果++で)

結果>終了の場合、ループに入らない可能性があるため、=すべてのコードパスが値を返すわけではありません

于 2012-08-29T09:04:22.973 に答える
1

「結果 < 終了」という条件が真であると仮定します。コントロールはループ内のステートメントに移動します。これは return ステートメントであるため、制御は関数/メソッド GetResult から出てきます。したがって、コントロールは「result++」に到達することはありません。それがあなたが得る理由です-到達不能コード。

役に立つかどうか教えてください。

ではごきげんよう !!!

于 2012-08-29T09:12:07.633 に答える
0

start >= end の場合、ループに入らないため

private int GetResult(int start, int end)
{
    for (int result = start; result < end; result++)
    {
        return result;
    } 
    return -1; // Path here exists
}

興味深いことに、 と の間の各整数を返したい場合は、start代わりendに yield return を確認する必要があります。

    private IEnumerable<int> GetResult(int start, int end)
    {
        for (int result = start; result < end; result++)
        {
            yield return result;
        }
        // Now we don't need a return, because the loop will eventually complete
    }

編集コメントを見ると、OPには一連の数字が必要な場合があります。

上記の方法は繰り返すことができます

foreach (int anInt in GetResult(40, 50))
{
    Console.WriteLine(string.Format("Next value is {0}", anInt));
}
于 2012-08-29T09:03:31.457 に答える
0

for ループの後に return ステートメントを追加すると、エラーなしでコンパイルされます。

于 2012-08-29T09:03:52.923 に答える
0
private int GetResult(int start, int end)
{
    int result = 0;

    for (result = start; result < end; result++)
    {
        return result;
    } 
    return result;

}
于 2012-08-29T09:04:08.903 に答える
0

この関数はのstart場合に戻りますstart < end。それ以外の場合は何も返しません。

あなたの方法の意図は何ですか?

于 2012-08-29T09:04:46.483 に答える
0

result < end条件が failedになったシナリオを考えてみましょう。そのため、コントロールはループに入らず、ループから抜け出します。しかし、外側には return ステートメントがないため、もう一方の端が return になる整数を期待しているため、何が返されるのでしょうか。そのため、エラーが発生します。

これは動作します:-

private int GetResult(int start, int end)
{
    for (int result = start; result < end; result++)
    {
        return result;
    } 
return 0;
}
于 2012-08-29T09:05:56.260 に答える
0

start > end 値の場合、ループ内のコードは実行されないため、関数から返されるものは何もないため、これらのエラーが発生します。さらに、最初のステップ自体で開始した場合、uが行ったようにforループを使用する意味はありません

private int GetResult(int start, int end)
{   
    if(start<end)
       return start;
    return -1;
}
于 2012-08-29T09:06:20.800 に答える
0

私は考えたり、あなたが彼らがしているforreturn思うことをしたりしません。あなたのコードを読むと、次のようになります。

private int GetResult(int start, int end)
{
    if (start < end)
    {
        return start;
    }
    else
    {
        return 0; // or another default for when start >= end
    }
}

なぜならreturn、まあ、メソッドから戻るからです。ループの最初の繰り返し (開始 < 終了の場合) はすぐに を返しresult、これは の値に設定されていますstart

コードが示すように、そのelse部分がありません。したがって、コンパイラは start >= end のときに何を返したいかを認識せず、また、直接返すため result++ が呼び出されないため、表示されているエラーと警告がスローされます。

于 2012-08-29T09:06:23.873 に答える