2016-07-10 18 views
6

Quando si definisce una funzione in C, ricevo un errore 'controllo può raggiungere la fine della funzione non vuota' nel compilatore quando si scrive la logica if/else in un certo modo (Scenario 1 sotto), ma non ricevo l'errore quando si scrive la logica in un altro modo (Scenario 2 di seguito). Per me, entrambi i modi di scrivere questa funzione sembrano simili, quindi sono in perdita sul motivo per cui la versione 1 non verrà compilata.C - Confuso da 'controllo può raggiungere la fine della funzione non vuota' quando si utilizza la sintassi se/else

Scenario 1

bool search(int value, int values[], int n) 
{ 
    int i; 
    if (n<1) 
     { 
      return false; 
     } 
    for(i=0;i<n;i++) 
    { 
     if (value==values[i]) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

} 

Scenario 2

bool search(int value, int values[], int n) 
{ 
    int i; 
    if (n<1) 
     { 
      return false; 
     } 
    for(i=0;i<n;i++) 
    { 
     if (value==values[i]) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

Will not Scenario 2 restituire sempre false dopo il ciclo for? Oppure la funzione essenzialmente 'Stop' dopo aver restituito un valore per la prima volta, quindi restituendo 'true' una volta che il valore corrisponde ai valori [i]?

+1

Nello scenario 1, tutte le istruzioni 'return' sono in blocchi condizionali. Così il compilatore vede questo e ti dà un avvertimento. – PaulMcKenzie

+0

I due scenari stanno facendo cose diverse. Scenario 1 il compilatore non è abbastanza intelligente da sapere che il ciclo for non verrà effettivamente utilizzato come quando i = 0 l'uno o l'altro verrà utilizzato –

+0

La funzione termina quando esegue un 'return', quindi il il secondo esempio non eseguirà il 'return false;' alla fine se colpisce prima un altro 'return's. – Dmitri

risposta

6

Il problema è che il compilatore C non è abbastanza intelligente per capire che non v'è alcun scenario quando la prima funzione sarebbe arrivare alla fine senza restituire un valore:

  • Quando il ciclo viene eseguito almeno una volta, non ci è un ritorno condizionale da entrambi i rami dell'istruzione if e
  • Quando il ciclo non viene mai eseguito, ci sarà un ritorno dall'istruzione condizionale nella parte superiore della funzione.

C standard non richiede tali controlli, quindi il compilatore emette un avviso.

+2

* Questo è anche il motivo per cui il compilatore non tiene conto del fatto che l'ultima dichiarazione di reso del tuo secondo codice non viene mai raggiunta. * - Questo non è vero - considera quando il valore non è nell'array. –

+0

@EdHeal Oops, hai ragione, ho perso il fatto che il ramo 'else' non è presente nel secondo snippet di codice. Il mio schermo del telefono è troppo piccolo per quello :-) Grazie! – dasblinkenlight

+0

Grazie a entrambi per le risposte: questo ha molto senso. Mi rendo conto ora che il falso ritorno nell'istruzione 'else' all'interno del ciclo restituirebbe semplicemente false al primo run-through a meno che, naturalmente, non trovasse fortunatamente il valore nell'array [0] – offthewall1066

Problemi correlati