Ошибка: управление может достигать конца не-void функции в C

Я не могу понять, почему эта ошибка происходит: error: control may reach end of non-void function

Вот код:

 bool search(int value, int values[], int n) { if (n < 1) { return false; } for (int i = 0; i < n; i++) { if (values[i] == value) { return true; break; } else { return false; } } } 

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

    Вы получаете эту ошибку, потому что если ваш цикл цикла прерывается из-за нарушения условия i < n; то он не находит никакого оператора return после цикла (см. ниже, я упомянул в коде как комментарий).

     for (int i = 0; i < n; i++){ if (values[i] == value){ return true; break; } else{ return false; } } // here you should add either return true or false } 

    Если for прерывания цикла из-за i >= n управление переходит в позицию, где я прокомментировал, и нет предложения return . Следовательно, вы получаете сообщение об ошибке «достичь конца не-void-функции в C».

    Кроме того, удалите break after return . если return выполняется, то разрыв никогда не будет иметь шансов на выполнение и разрыв цикла.

      return true; -- it returns from here. break; -- " remove it it can't executes after return " 

    Проверьте, что ваш компилятор должен дать вам предупреждение - «недостижимый код».

    Предупреждение этого компилятора неверно. Во всяком случае, с вашим кодом возникает большая проблема:

     bool search(int value, int values[], int n) { if (n < 1) { return false; } for (int i = 0; i < n; i++) { if (values[i] == value) { return true; break; } else { // ! return false; // ! <-- Here is the mistake. } // ! } } 

    Этот код только проверяет values[0] == value и затем всегда возвращает. Это происходит из-за этого else {return false;} .

    Вы должны написать так:

     bool search(int value, int values[], int n) { if (n < 1) { return false; } for (int i = 0; i < n; i++) { if (values[i] == value) { return true; // break; <- BTW, it's redundant. } } return false; } 

    Теперь функция проверяет весь массив values и затем возвращает false если совпадений не было. Но если он найдет совпадение, он мгновенно вернет true проверку других элементов.

    Кроме того, компилятор не выдаст предупреждение для этого кода.

    Ваш код эквивалентен

     return (n > 0 && values [0] == value); 

    Либо вы привыкли писать очень простые вещи чрезмерно сложным способом, либо этот код не делает того, что вы хотите.

    Некоторые люди, вероятно, будут ненавидеть это, но ….

     bool search(int value, int values[], int n) { if (n < 1) { return false; } bool ret = false; for (int i = 0; i < n; i++) { if (values[i] == value) { ret = true; break; } } return ret; }