2014-11-05 4 views
0

Я пытаюсь написать программу на C#, чтобы узнать, является ли число простым числом. Я использую первые два оператора if для выделения многих параметров, а затем я пытаюсь вложить петлю в заключительный оператор else, и он говорит мне, что обнаружен «недостижимый код».Сообщение об ошибке «Недоступный код» в C#

public static bool primeNumber() 
    { 
     Console.Write ("Please enter a number to see if it is a prime number: "); 
     int num = int.Parse (Console.ReadLine()); 
     if (num % 2 == 0) 
      return false; 
     else if (num % 5 == 0) 
      return false; 
     else { 
      for (int i = 3; i < num/2; i += 2) 
      { 
       if (num % i == 0) 
        return false; 
       else 
        return true; 
      } 
     } 
    } 
+0

Вы пробовали отладку? – Haris

+0

Что такое недостижимый код здесь? Компилятор указал какой-то код, можете ли вы сделать то же самое? –

+7

Или вы на самом деле означали, что «не все пути кода возвращают значение», что является реальной ошибкой здесь? –

ответ

11

Есть две проблемы:

  • Недоступен код
  • Метод не возвращает значение во всех случаях

В то время как проблема возвращается значение ошибки, и прекратит компиляцию от завершения, недостижимый код является всего лишь предупреждением. Под «просто» я подразумеваю, что это не обязательно остановит ваш компилятор, но вы должны рассматривать его как признак ошибки.

Позвольте мне написать новый пример, который показывает реальную проблему здесь:

public static bool primeNumber (int num) 
{ 
    for (int i = 0; i < num; i++) 
    { 
     if (i < 10) 
      return false; 
     else 
      return true; 
    } 
} 

Давайте посмотрим, что этот метод делает:

  1. Он запускает петлю
  2. Первое, что в цикле это проверяет что-то
  3. В зависимости от этого что-то, он возвращает то или это. Она возвращается

Таким образом, он никогда не попадает в этот разряд:

for (int i = 0; i < num; i++) 
         ^^^ 

это недостижимый код.

Во-вторых, компилятор в вашем случае не может определить, будет ли значение num значением, которое позволяет циклу запускаться, тем самым всегда возвращая что-то. Таким образом, компилятор считает, что есть вероятность, что у вас есть num (в моем примере это может быть -1) значение, которое не позволит запуску цикла, заставляя программу пропускать цикл, и, таким образом, мы заканчиваем с другим ошибка, что должен вернуть метод?

Если мы вернемся к коду, вот способ переписать метод

public static bool primeNumber() 
{ 
    Console.Write ("Please enter a number to see if it is a prime number: "); 
    int num = int.Parse (Console.ReadLine()); 
    if (num % 2 == 0) 
     return false; 
    else if (num % 5 == 0) 
     return false; 
    else { 
     for (int i = 3; i < num/2; i += 2) 
     { 
      if (num % i == 0) 
       return false; 
     } 
     return true; 
    } 
} 
  • пользователя по только возвращающиеся в петле, если мы додумались число, которое доказывает тест (то есть. это не простое число), мы удалим проблему недостижимого кода
  • , тогда, если нам удастся запустить цикл до завершения, мы не смогли бы доказать, что это не простое число, поэтому оно равно. номер, а затем мы возвращаем true.

Мнение: Вы не должны иметь функцию, предлагающее пользователю, а затем возвращает ответ.Вместо этого я хотел бы написать это (LINQPad) программы:

void Main() 
{ 
    Console.Write ("Please enter a number to see if it is a prime number: "); 
    int num = int.Parse (Console.ReadLine()); 
    if (primeNumber(num)) 
     Console.WriteLine(num + " is a prime number"); 
    else 
     Console.WriteLine(num + " is a not prime number"); 
} 

public static bool primeNumber (int num) 
{ 
    if (num % 2 == 0) 
     return false; 
    else if (num % 5 == 0) 
     return false; 
    else { 
     for (int i = 3; i < num/2; i += 2) 
     { 
      if (num % i == 0) 
       return false; 
     } 
     return true; 
    } 
} 
1

Ваш for петля ничего не делает здесь, как она возвращается на первом запуске, так

i += 2 

никогда не достигается.

Весь цикл for эквивалентен одному return true.

Смежные вопросы