Что означает «контроль достигает конца не пустой функции»? - PullRequest
19 голосов
/ 30 мая 2011

Я получаю странные ошибки компилятора в этом алгоритме двоичного поиска. Я получаю предупреждение, что 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;
}

Ответы [ 5 ]

32 голосов
/ 30 мая 2011

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

11 голосов
/ 30 мая 2011

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

0 голосов
/ 09 января 2015

добавить к вашему коду:

"#include < stdlib.h>"

return EXIT_SUCCESS;

в конце main()

0 голосов
/ 06 января 2014

У меня была такая же проблема. Мой код ниже не работает, но когда я заменил последнее «если» на «еще», это работает. Ошибка была: может достигнуть конца не пустой функции.

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'; 
        }

  }
0 голосов
/ 30 мая 2011

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

...