Come uscire in modo corretto da una "void"

void Prova(){
  int n;
  
  while (n >= 1){
    if (n == 4) break;    // prima modalità uscita dalla VOID
    if (n == 5) return;   // seconda modalità
  }

  return;
}

Riferendomi al precedente listato, vorrei chiedere quale delle modalità descritte risulta più corretta per uscire da una void.

Nel prima condizione, con il "break" esco dal "while" e quindi chiudo la "void" con il "return".

Nel secondo caso esco direttamente con un "return", lasciando per così per dire il "while" in sospeso.

Grazie per il contributo.

A parte che il compilatore accetta tutte e due i casi allo stesso modo, a quello che so il nodo formalmente corretto sarebbe usare un solo return alla fine di tutta la funzione, quindi quello contenente la break. Per completare, a quanto ne so, un return finale é sottinteso, almeno nelle void, ma comunque é preferibile esplicito

Non so se ci sia un modo più corretto dell'altro... aspetta un purista del codice.
Dal lato pratico, con un codice più complesso a volte è più semplice mettere il return nel punto esatto un cui serve invece di arrivare in fondo alla funzione.

Si chiamano FUNZIONI, non void, questa cosa mi dà un fastidio terribile!!! void è il tipo di ritorno.

Le regole della programmazione strutturata vorrebbero che ci fosse un unico return per funzione, e io seguo sempre questo principio, il flusso del codice risulta più facile da seguire. Per brevi funzioni si può anche trasgredire, ma in generale io consiglio di evitare return multipli, tanto amati dai programmatori Java.

invece del if userei switch però... della serie

void Prova(){
  int n;
  
  while (n >= 1){
    switch (n) {
      case 4:
         break;
      case 5:
         break;
      default: //a volte dimenticato ma validissimo
         break;
}

  return;
}
}

https://www.arduino.cc/reference/en/language/structure/control-structure/break/:
break is used to exit from a for, while or do…while loop, bypassing the normal loop condition. It is also used to exit from a switch case statement.

[quote author=return - Arduino Reference ]
(return()) Terminate a function and return a value from a function to the calling function, if desired.[/quote]

La differenza é la sopratutto che return() puó dare un valore di ritorno e da quello che ho capito che break() non é adatto per uscire da una funzione.

Ciao Uwe

Certo, nel codice postato break esce solo dal while, ma c'è un return subito fuori.

Messo da parte l'aspetto formale di rispettare quanto più possibile il classico "return" finale, il mio quesito era finalizzato a capire se l'uscita anticipata da un "void" dall'interno di "while", "for" o "switch" compromettesse in qualche modo affidabilità del codice.

Grazie per gli interventi.

TI HO DETTO CHE SI CHIAMANO FUNZIONI!!! :disappointed_relieved:

Non comporta nessun problema, il compilatore sa "uscirne bene".

Chiedo venia ... visto che stiamo parlando del "C" vedrò di utilizzare le corrette definizioni.

Arrivo da una realtà in cui le subroutine si chiamavano comandi o funzioni ed avevano diverso significato.

Ne dubito, probabilmente il concetto è esattamente lo stesso, proprio per questo è importante che tu capisca esattamente cos'è quel void e perché sta lì.

lelebum:
Arrivo da una realtà in cui le subroutine si chiamavano comandi o funzioni ed avevano diverso significato.

Probabilmente le "command" erano in realtà a tutti gli effetti delle funzioni che però non ritornavano alcun valore (equivalente a ritornare void in 'C'), mentre le "function" restituivano un valore (equivalente a ritornare uno dei tipi validi in 'C') ... giusto ? :slight_smile:

Per curiosità, che linguaggio ?

Guglielmo

Ad esempio in Pascal procedure e function sono due cose ben distinte.

Claudio_FF:
Ad esempio in Pascal procedure e function sono due cose ben distinte.

SI, ma SE ben ricordo ... vale quanto ho detto sopra anche per il Pascal. Le "procedures" NON ritornano un valore mentre le "functions" si ... ::slight_smile:

Guglielmo

Certo, la differenza è quella.

quindi nel C++ il return è praticamente INUTILE????
lo immaginavo.

Puso:
quindi nel C++ il return è praticamente INUTILE????
lo immaginavo.

NON hai capito molto ... rileggiti la discussione !

Guglielmo

*P.S.: ... e chiediti come esci da una "funzione" ritornando un valore * :smiling_imp:

con un IF

:confused: :slight_smile: :slight_smile: :drooling_face: :drooling_face: :roll_eyes: :roll_eyes:

Puso:
con un IF

... che faccio ... applico il BAN ? ? ? :smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp:

Guglielmo