2017-10-18 98 views
-3

我剛剛學習了方法聲明,我不知道如何使用它,我試圖做一個算法,需要2個數字並返回其最小值常見的鴻溝,如果沒有共同的分頻器,返回-1,這就是代碼:並非所有的代碼路徑都返回一個值,但無論如何都有值返回

class Program 
    { 
     static int Div(int a, int b) 
     { 
      int max = Math.Max(a, b); 
      bool div = false; 
      for(int i = 2; i <= max/2; i++) 
      { 
       if (a % i == 0 && b % i == 0) 
       { 
        return i; 
        div = true; 
        i = max; 
       } 

      } 
      if (div == false) 
      { 
       return -1; 
      } 
     } 

     static void Main(string[] args) 
     { 
      Console.WriteLine("Please Enter 2 Numbers"); 
      int num = int.Parse(Console.ReadLine()); 
      int num2 = int.Parse(Console.ReadLine()); 
      Console.WriteLine(Div(num, num2)); 

     } 
    } 

它告訴我,有一個無法訪問的代碼,而不是所有的代碼路徑返回一個值,但爲什麼呢?如果我得到2個數字,確實有一個commong divider它會返回它,如果不是它將返回-1,沒有任何遺漏,我認爲,在此先感謝

+1

'div = true; i = max;'由於在'return'之後無法訪問。這些行永遠不能執行。 – ADyson

+0

你的'Div'函數不能保證返回一個值。可能沒有達到任何'return'語句。 – Amy

+0

你有幾個問題...首先在你的for循環中,return語句之後的代碼將不會被觸發,因爲return語句將停止函數內的進一步處理並返回'i'的值。其次,如果你的for循環中的條件不符合,你不需要將最終返回值包含在條件中,這是拋出編譯器的原因。編譯器不知道div肯定是錯誤的,所以警告你有可能沒有任何東西從函數返回 - 刪除條件,這個問題就會消失。 – Diado

回答

3

編譯器不夠聰明。但最後if是多餘的呢,因爲它總是false那裏,所以你可以寫下面這也避免了編譯器錯誤:

static int Div(int a, int b) 
{ 
    int max = Math.Max(a, b); 

    for (int i = 2; i <= max/2; i++) 
    { 
     if (a % i == 0 && b % i == 0) 
     { 
      return i; 
     } 
    } 
    return -1; 
} 

在循環中的return是不可達的和不必要的後一部分,所以我刪除它。

+0

謝謝,但我不明白爲什麼在循環之後它總是會出現錯誤,我的意思是,即使我找到了分隔符,循環之後不會繼續嗎? – Nadavs2310

+0

因爲如果循環可能會輸入將其設置爲true的部分,則會因爲返回該值而退出該方法。返回語句後的paet無法訪問。 –

+0

等待,如果我返回一個值,該方法會停止嗎?因爲如果我知道問題是什麼,但我不知道 – Nadavs2310

0

當您使用return立即退出該函數,該行將執行,因此後面的行不可訪問。

return i; 
div = true; << 
i = max; << 

在你的情況,好像你只是想設置這些返回前值。

0
if (a % i == 0 && b % i == 0) 
{ 
    return i; 
    div = true; 
    i = max; 
} 

返回後的2行永遠不會到達。把它們放在返回之前。此外,我不認爲你需要一個div布爾。這是多餘的,可以進行優化。

0

證明一個任意的方法是否可以達到方法的結尾而不碰到return或拋出異常可能是一個無法解決的問題。如果您足夠努力,您總是可以構建一種方法,使編譯器無法證明端點是否可訪問。但是,編譯器不允許任何具有返回值但沒有可達端點的程序。

因此,有誤報。編譯器最好確定一個程序是否具有可到達的端點,並且如果它未能證明它,它將會出錯,即使你和我都知道端點實際上不可達。

您需要更改代碼,以便編譯器能夠證明端點無法訪問,而最簡單的方法是除去if (div == false)行,並且總是刪除return -1;。你和我知道div在那裏永遠不會是真的,但編譯器還不夠成熟以證明它。

0

第一返回如果在for循環子句是代碼的其餘部分之前,所以有2行代碼,將永遠不會被打到,這2:

div = true; 
i = max; 

他們」的原因將永遠不會被擊中是因爲如果if語句是真的,它會立即返回,如果它是假的,它會到第二個如果。

0

2個原因:行div = true無法訪問,返回後的代碼未執行。通過

int res=i; 
div = true; 
i = max; 
return res; 

和替換

return i; 
div = true; 
i = max; 

最後一個「如果」條款沒有「其他」條款,允許在所有情況下返回;

相關問題