Что означает "контроль до конца не-недействительной функции"?

Я получаю странные ошибки компилятора в этом алгоритме бинарного поиска. Я получаю предупреждение, что control reaches end of non-void function. Что это значит?

int binary(int val, int sorted[], int low, int high) {
    int mid = (low+high)/2;

    if(high < low)
        return -1;

    if(val < sorted[mid])
        return binary(val, sorted, low, mid-1);

    else if(val > sorted[mid])
        return binary(val, sorted, mid+1, high);

    else if(val == sorted[mid])
        return mid;
}

Ответ 1

Компилятор не может сказать из этого кода, если функция когда-либо дойдет до конца и все еще что-то вернет. Чтобы это было ясно, замените последний else if(...) на else.

Ответ 2

Компилятор недостаточно умен, чтобы знать, что <, > и == являются "полным набором". Вы можете сообщить об этом, удалив условие "if (val == sorted [mid])" - это избыточно. Jut сказал "else return mid;"

Ответ 3

Всегда создавайте, по крайней мере, минимальную оптимизацию. С -O0 весь анализ, который компилятор может использовать для определения того, что выполнение не может дойти до конца функции, отключено. Вот почему вы видите предупреждение. Единственный раз, когда вы когда-либо использовали -O0, - это поэтапная отладка, которая обычно не является хорошим подходом к отладке, но это то, что большинство людей, начавших работу с MSVC, узнали...

Ответ 4

У меня была та же проблема. Мой код ниже не работал, но когда я заменил последнее "если" на "else", он работает. Ошибка: может достигать конца не-void-функции.

int shifted(char key_letter)
  {
        if(isupper(key_letter))
        {
            return key_letter - 'A'; 
        }

        if(islower(key_letter)   //<----------- doesn't work, replace with else

        {                                            


            return key_letter - 'a'; 
        }

  }

Ответ 5

добавить в свой код:

"#include < stdlib.h>"

return EXIT_SUCCESS;

в конце main()