Goto-erklæring i programmering: definition, brug og alternativer

Få klar forståelse af goto-erklæringen i programmering: definition, brug, fordele/risici og sikre alternativer med eksempler og bedste praksis.

Forfatter: Leandro Alegsa

goto er en erklæring i mange programmeringssprog. Det er en kombination af de engelske ord go og to. Det er en måde at springe til en anden kodelinje på.

Mange sprog understøtter goto-erklæringen, og mange gør ikke. I Java er goto et reserveret ord, men kan ikke bruges. (Et reserveret ord er et ord, der er en del af programmeringssproget og ikke kan bruges til andre ting, f.eks. til at navngive variabler).

Inden for datalogi findes der en teori, der kaldes det strukturerede programteorem. Denne teori siger, at ethvert program kan skrives på en sådan måde, at tingene udføres med funktioner og metoder (mindre underprogrammer) i stedet for i et meget stort program og goto-angivelser. Teorien beviser, at goto-erklæringen ikke er nødvendig for at skrive programmer.

Hvad gør goto konkret?

goto springer udførelsen direkte til en mærket (label) sted i samme funktion eller blok. Labels er normalt et navn efterfulgt af et kolon, f.eks. label:. Når koden når en goto label;, fortsætter programmet udførelsen fra den linje, hvor label er defineret.

Eksempler

Her er et simpelt eksempel i C:

int i = 0; start:     if (i >= 3) goto end;     printf("%d\n", i);     i++;     goto start; end:     return 0; 

Et andet typisk mønster i C er at bruge goto til oprydning ved fejl (clean-up):

FILE *f = fopen("fil", "r"); if (!f) return -1; /* ... */ if (fejl) goto cleanup; /* ... */ cleanup:     if (f) fclose(f);     return status; 

Når er goto nyttigt?

  • Low-level programmering og assembly-lignende kode, hvor direkte hop er naturligt.
  • Genereret kode (f.eks. værktøjer der skriver kode automatisk), hvor strukturerede kontroller kan være svære at skabe.
  • Fejlhåndtering i visse sprog (fx C) hvor undtagelser ikke findes — goto til et cleanup-afsnit kan give mere overskuelig oprydning end dybe if/else-kæder.
  • Enkelte performance-kritiske tilfælde, hvor kompilatoren ikke kan optimere alternative strukturer lige så godt — men det er sjældent nødvendig i moderne kode.

Kritik og historie

I 1968 skrev Edsger W. Dijkstra det berømte brev "Go To Statement Considered Harmful", hvor han argumenterede for, at brug af goto ofte fører til uoverskuelig, sværvedligeholdelig "spaghetti-kode". Det har været et vigtigt vendepunkt i programmeringspraksis og medvirkede til fremme af struktureret programmering.

Kritikken går på, at ubegrænset hopping rundt i kode gør kontrolflow svært at følge, hvilket øger risikoen for fejl og gør kode vanskelig at teste og ændre.

Alternativer til goto

I moderne sprog og god praksis anbefales ofte følgende alternativer:

  • Funktioner/metoder: Opdel kode i mindre, genanvendelige enheder.
  • Kontrolstrukturer: if, for, while, switch — giver klart og læsbart flow.
  • Break/continue/return: Til at springe ud af loops eller afslutte en funktion tidligt på en læselig måde.
  • Undtagelser (exceptions): Bruges til at håndtere fejl og oprydning i sprog, der understøtter dem (f.eks. Java, C#, Python).
  • Labeled breaks/continues: Nogle sprog (f.eks. Java) har etiketterede breaks/continues, som kan erstatte visse goto-mønstre på en mere kontrolleret måde.

Hvilke sprog har goto?

  • Mange ældre sprog inkluderer goto: BASIC, Fortran, C, C++, Pascal, Assembly.
  • Nogle sprog reserverer ordet men lader det ikke bruges — f.eks. Java reserverer goto, men implementerer det ikke.
  • Andre moderne sprog undgår det bevidst (f.eks. Rust har ikke goto), mens visse sprog (Perl, PHP) tilbyder kontrolstrukturer med lignende funktionalitet.
  • Python har ikke en indbygget goto; tredjepartsmoduler har forsøgt at tilføje det, men det er ikke almindeligt brugt eller anbefalet.

Praktiske anbefalinger

  • Sørg for læsbarhed: Undgå goto i almindelig applikationskode. Brug strukturerede alternativer, så andre nemt kan forstå flowet.
  • Brug goto med omtanke: Hvis du af praktiske grunde bruger goto (fx i C til clean-up eller i lavniveau-kode), begræns det til små, velkommenterede områder og dokumentér hvorfor.
  • Refaktor om muligt: Hvis du arver kode med mange goto'er, overvej at refaktorisere til funktioner og klare kontrolstrukturer for bedre vedligeholdelse.

Konklusion

goto er et simpelt, men kraftfuldt værktøj: det giver mulighed for direkte hop i koden, men kan hurtigt gøre kode uoverskuelig. Struktureret programmering viser, at de fleste problemer kan løses uden goto, og nutidig praksis anbefaler derfor at foretrække klare kontrolstrukturer, funktioner og undtagelseshåndtering. Alligevel har goto stadig legitime anvendelser i visse lavniveau- og fejloprydningstilfælde — brug det kun når fordelene klart opvejer de potentielle problemer.

Brug

En goto-anvisning bruges normalt sammen med en label. En label er et ord, der identificerer et sted i et stykke kode. En goto-anvisning i kode ser normalt således ud:

gå til LABEL

I dette eksempel vil computeren hoppe til placeringen af LABEL.

Mange gange kombineres goto-erklæringen med if-erklæringen. I dette tilfælde vil computeren kun springe til et andet sted i koden, hvis noget er sandt. For eksempel:

IF betingelse THEN gå til LABEL

Dette kan læses som "hvis en bestemt betingelse er sand, skal du gå til placeringen af LABEL".

Forskellige programmeringssprog har forskellige restriktioner eller begrænsninger for brugen af goto-angivelser. Programmeringssproget C tillader f.eks. ikke, at et goto-spørgsmål hopper til et sted inden for en anden funktion (underprogram).

Spørgsmål og svar

Spørgsmål: Hvad er en goto-erklæring?


A: En goto-anvisning er en måde at springe til en anden kodelinje på i mange programmeringssprog.

Spørgsmål: Hvor mange programmeringssprog understøtter goto-erklæringen?


Svar: Mange programmeringssprog understøtter goto-erklæringen.

Spørgsmål: I hvilket programmeringssprog er goto et reserveret ord?


Svar: I Java er goto et reserveret ord, men det kan ikke bruges.

Spørgsmål: Hvad er et reserveret ord i et programmeringssprog?


Svar: Et reserveret ord er et ord, der er en del af programmeringssproget, og som ikke kan bruges til andre ting, f.eks. til at navngive variabler.

Spørgsmål: Hvad er det strukturerede programteorem i datalogi?


A: Teoremet om strukturerede programmer er en teori inden for datalogi, der siger, at ethvert program kan skrives på en sådan måde, at tingene udføres med funktioner og metoder i stedet for i ét meget stort program og goto-angivelser.

Spørgsmål: Beviser den strukturerede programteorem, at goto-statements er nødvendige for at skrive programmer?


Svar: Nej, teoremet om strukturerede programmer beviser, at goto-erklæringen ikke er nødvendig for at skrive programmer.

Spørgsmål: Hvad er funktioner og metoder i programmering?


Svar: Funktioner og metoder er mindre underprogrammer, der anvendes i programmering til at udføre specifikke opgaver.


Søge
AlegsaOnline.com - 2020 / 2025 - License CC3