Que signifie “contrôle atteint la fin de la fonction non vide”?

J’ai eu d’étranges erreurs de compilation sur cet algorithme de recherche binary. Je reçois un avertissement indiquant que le control reaches end of non-void function . Qu’est-ce que ça veut dire?

 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, mid+1, high); else if(val == sorted[mid]) return mid; } 

Le compilateur ne peut pas dire à partir de ce code si la fonction atteindra jamais la fin et retournera toujours quelque chose. Pour que cela soit clair, remplacez la dernière else if(...) par juste else .

Le compilateur n’est pas assez intelligent pour savoir que < , > et == sont un "ensemble complet". Vous pouvez le faire savoir en supprimant la condition "if (val == sortingé [milieu])" - c'est redondant. Jut dit " else return mid; "

Toujours construire avec au moins une optimisation minimale. Avec -O0 , toutes les parsings que le compilateur pourrait utiliser pour déterminer que l’exécution ne peut pas atteindre la fin de la fonction ont été désactivées. C’est pourquoi vous voyez l’avertissement. La seule fois où vous devriez utiliser -O0 est pour le débogage étape par ligne, qui n’est généralement pas une bonne approche de débogage, mais c’est ce que la plupart des gens qui ont commencé à utiliser -O0 appris sur …

J’ai eu le même problème. Mon code ci-dessous n’a pas fonctionné, mais lorsque j’ai remplacé le dernier “if” par “else”, cela fonctionne. L’erreur était: peut atteindre la fin de la fonction non-vide.

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

append à votre code:

 "#include < stdlib.h>" return EXIT_SUCCESS; 

à la fin de main()