Pagina 1 di 2

Label dopo if

MessaggioInviato: 2 dic 2022, 8:55
da EcoTan
Prendiamo per esempio questo pezzo di codice:
Codice: Seleziona tutto
if (a==5) goto pure;
if(b==4)
pure: c=18;

Lo so che si può fare diversamente, che è contorto eccetera. Una cosa simile mi serve, pare che funzioni ma mi lascia dei dubbi. Si può saltare dentro una if?

Re: Label dopo if

MessaggioInviato: 2 dic 2022, 9:28
da stefanopc
Di che ambiente di sviluppo stiamo parlando?
Potresti dare qualche informazione aggiuntiva.
In ogni caso
https://www.okpedia.it/goto-salti-incon ... nguaggio-c

Riguardo ad if io preferisco delimitare con le parentesi {} ciò che segue per non avere dubbi .
Naturalmente io sono un autodidatta aspetta i consigli di un esperto.
Ciao

Re: Label dopo if

MessaggioInviato: 2 dic 2022, 10:03
da pusillus
se è in C il "goto" è altamente sconsigliato come buona pratica di programmazione.

Re: Label dopo if

MessaggioInviato: 2 dic 2022, 10:29
da WALTERmwp
EcoTan ha scritto:(...) Si può saltare dentro una if?
intendi se "dall'interno" di un if senza graffe può essere eseguito il salto?
Direi di si; poi, come osservato, non si può escludere che un compilatore rispetto ad un altro interpreti lo statement come una eccezione perché assenti le parentesi graffe.
Ad alto livello è solo una istruzione e l'indirizzo un parametro; ovvio che nello specifico basta provare.
L'eventuale incompatibilità per il banco di memoria di destinazione, ammesso ci sia, dovrebbe essere sempre verificata, penso.
Per il resto non rilevo controindicazioni, brutalità a parte.

Saluti

Re: Label dopo if

MessaggioInviato: 2 dic 2022, 12:03
da djnz
stefanopc ha scritto:Riguardo ad if io preferisco delimitare con le parentesi {} ciò che segue per non avere dubbi

Infatti è una delle regole di buona codifica: https://barrgroup.com/embedded-systems/books/embedded-c-coding-standard (General Rules → Braces)

EcoTan ha scritto:Si può saltare dentro una if?

Il goto in qualsiasi linguaggio è incondizionato e condizionato. Non poter effettuare un salto condizionato da if, ma solo incondizionato, sarebbe assurdo perfino per lo spaghetti-code, e in linguaggi più arcaici o in assembly, dopo una condizione ci può andare appunto solo un salto. Però bisogna fare attenzione a saltare solo in punti interni alla stessa funzione per garantire l'integrità dello stack (in teoria il compilatore dovrebbe lamentarsi se si prova a fare altrimenti).

Re: Label dopo if

MessaggioInviato: 2 dic 2022, 14:00
da GioArca67
EcoTan ha scritto:Prendiamo per esempio questo pezzo di codice:
Codice: Seleziona tutto
if (a==5) goto pure;
if(b==4)
pure: c=18;

[...] ma mi lascia dei dubbi.

Meno male

EcoTan ha scritto:Si può saltare dentro una if?



Ma per il codice presentato è del tutto inutile il goto... basta fare
Codice: Seleziona tutto
if(a==5 || b==4) c=18;

Se entri nell'if b==4 anche da altre parti può avere un senso (forse). Comunque, ovviamente, l'eventuale statement false non viene eseguito se si entra nello statement true con un goto.

Re: Label dopo if

MessaggioInviato: 2 dic 2022, 16:08
da EcoTan
WALTERmwp ha scritto:intendi se "dall'interno" di un if senza graffe può essere eseguito il salto?

"verso l'interno", non "dall'interno". Le graffe possono esserci, anzi ci saranno sicuramente se le istruzioni dentro la if sono più di una. Anche dalle altre risposte, ricavo la conclusione che il salto si può fare, al più sarà da verificare, ma se funziona una volta funzionerà sempre nel senso che non ci sono mine sotterrate tipo stack overflow. L'ambiente è il C di MPLABX.

Re: Label dopo if

MessaggioInviato: 2 dic 2022, 16:38
da ThEnGi
Al C non piace il GOTO, non sai mai dove va a finire. Con un linguaggio basso sai di preciso cosa compie il prgoramma invece con il C (e a salire) non sai cosa ci sta nel mezzo.
Perciò lascialo al assembly dove sta di casa.
Questo non vuol dire che non può funzionare ma semplicemente che è buona norma non usarlo

La soluzione di Foto UtenteGioArca67 è la più facile

O_/

Re: Label dopo if

MessaggioInviato: 2 dic 2022, 18:10
da GioArca67
Inoltre in C99 sono stati introdotti i VLA (Variable Length Array) e col goto non puoi "volare", in avanti sopra una VLA, es.:
Codice: Seleziona tutto
goto lab1; // OK: going into the scope of a regular variable
    int n = 5;
lab1:; // Note, now n is uninitialized, as if declared by int n;

     goto lab2;   // Throws Error: going into the scope of VM types
     double a[n]; // a VLA

lab2:;


Invece in questo non si arrabbia:
Codice: Seleziona tutto
{
   int n = 1;
label:;
   int a[n]; // re-allocated 10 times, each with a different size
   if (n++ < 10) goto label; // leaving the scope of a VM
}

ed ogni volta che esce dallo scope della VLA essa viene deallocata automaticamente e quindi, quando trova di nuovo int a[n]; la rialloca a runtime (solo C99)

Re: Label dopo if

MessaggioInviato: 2 dic 2022, 18:15
da Etemenanki
pusillus ha scritto:se è in C il "goto" è altamente sconsigliato come buona pratica di programmazione.

Ma come ... "10 GOTO 10" non era il comando piu utile inventato dai programmatori ? :mrgreen: :mrgreen: :mrgreen: