web-dev-qa-db-fra.com

Que signifie «le contrôle atteint la fin de la fonction non nulle»?

J'ai reçu d'étranges erreurs de compilation sur cet algorithme de recherche binaire. Je reçois un avertissement indiquant que 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, low, mid-1);

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

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

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

32
rid

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

11

Construisez toujours avec une optimisation au moins minimale. Avec -O0, toutes les analyses 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, ce qui n'est généralement pas une bonne approche de débogage de toute façon, mais c'est ce que la plupart des gens qui ont commencé avec MSVC ont appris sur ...

0
R..

J'ai eu le même problème. Mon code ci-dessous n'a pas fonctionné, mais lorsque j'ai remplacé le dernier "si" par "autre", cela fonctionne. L'erreur était: peut atteindre la fin de la fonction non nulle.

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
Thuy