2009-05-30 15 views
0

喜即時通訊新的C#,並試圖代碼,但得到錯誤 任何人可以幫助我解決這個我到底做錯了什麼?爲什麼我收到此錯誤:不是所有的代碼路徑返回一個值?

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace hodder 
{ 
    class Program 
    { 
     public static void Main() 
     { 
      isHodder(3); 
     } 

     static int isHodder(int n) 
     { 
      int k = n; 
      for (int i = 2; i <= n/2;i++) 
      { 
       if ((n % 1) == 0) 
       { 
        return 0; 
       } 
       else 
       { 
        for (int j = 2; j <= k;j++) 
        { 
         if (n == (2^ j) - 1) 
         { 
          return 1; 
         } 
         else 
         { 
          return 0; 
         } 
         k=(2^j)-1; 
        } 
       } 
      } 
     } 
    } 
} 

即時得到上錯誤 「靜態INT isHodder(INT n)的」 'hodder.Program.isHodder(INT)':不是所有的代碼路徑返回值

和關於「 」不可達代碼檢測的「 K =(2^j)的-1"

+1

錯誤將是有益的。 – kenny 2009-05-30 11:55:51

+0

我認爲它的好做法是在函數結束時只有一個返回語句。更易於閱讀和調試。 – UrbanEsc 2011-07-19 06:45:30

回答

7

第一誤差‘不是所有的代碼路徑返回一個值’意指存在該代碼可以遵循在沒有值將被返回(即,路徑:主叫isHodder(1 ))。你需要在for循環之外返回一些值。此外,由於第二個for循環中有一個if/else塊,因此行

k=(2^j)-1; 

永遠不會執行。

static int isHodder(int n) 
    { 
     int k = n; 
     for (int i = 2; i <= n/2; i++) 
     { 
      if ((n % 1) == 0) 
      { 
       return 0; 
      } 
      else 
      { 
       for (int j = 2; j <= k; j++) 
       { 
        if (n == (2^j) - 1) 
        { 
         return 1; 
        } 
        else 
        { 
         return 0; 
        } 
        k = (2^j) - 1; 
       } 
      } 
     } 
     return 0; 
    } 
+0

在K =(2^j)的尼斯趕上-1 ;,因爲我覺得你得到它OP添加的錯誤消息之前。我只注意到了回報... – 2009-05-30 12:05:33

4

這條線是高度懷疑:

if ((n % 1) == 0) 
1

如果我叫isHodder(1)會發生什麼?我能達到哪個回報聲明?

我們可能永遠不會進入對所有循環(或者,如果我們做的進入,編譯器不能確保我們達到一個return語句我們離開循環之前)。

0

@jalf:對於其中2 < = n/2(即,4 < = n)的情況是正確的。你永遠不會進入在這種情況下循環,所以你需要for後的回報。

由於@Kenny建議,

if ((n % 1) == 0) 

的嫌疑。 N%1總是== N,因此n == 0時,然而,情況只會是真實的,它也像這可能是一個錯字,因爲條件不測試任何東西環路內變化。你的意思是

if ((n % i) == 0) 

0

對於這個問題,你必須使用無效的,如果你的函數沒有返回任何值,否則你必須在你的函數的末尾,用於定義一個返回值。

相關問題