Ответ 1
Компилятор не может сказать из этого кода, если функция когда-либо дойдет до конца и все еще что-то вернет. Чтобы это было ясно, замените последний else if(...)
на else
.
Я получаю странные ошибки компилятора в этом алгоритме бинарного поиска. Я получаю предупреждение, что 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;
}
Компилятор не может сказать из этого кода, если функция когда-либо дойдет до конца и все еще что-то вернет. Чтобы это было ясно, замените последний else if(...)
на else
.
Компилятор недостаточно умен, чтобы знать, что <
, >
и ==
являются "полным набором". Вы можете сообщить об этом, удалив условие "if (val == sorted [mid])" - это избыточно. Jut сказал "else return mid;
"
Всегда создавайте, по крайней мере, минимальную оптимизацию. С -O0
весь анализ, который компилятор может использовать для определения того, что выполнение не может дойти до конца функции, отключено. Вот почему вы видите предупреждение. Единственный раз, когда вы когда-либо использовали -O0
, - это поэтапная отладка, которая обычно не является хорошим подходом к отладке, но это то, что большинство людей, начавших работу с MSVC, узнали...
У меня была та же проблема. Мой код ниже не работал, но когда я заменил последнее "если" на "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';
}
}
добавить в свой код:
"#include < stdlib.h>"
return EXIT_SUCCESS;
в конце main()