2009-06-06, 12:51
  #25
Medlem
Citat:
Ursprungligen postat av Ergodyne
En lite fråga vad ni tycker om att använda goto när man skriver c++

Jag fick alltid lära mig att man aldrig aldrig aldrig ska använda goto när man skriver c eller framförallt c++. Men på senare tid har jag stött på kod som använder det ganska flitigt.

Det finns inget "aldrig", ibland passar en lösning och ibland passar något annat. goto kan absolut vara bästa lösningen för vissa situationer. det är ju upp till programmeraren och tänka lite själv med, alltså hur den slutliga koden ser ut och vad som eventuellt kan vara problematiskt.

Det "värsta" med goto är ju att det snabbt kan bli spagetti om programmeraren inte tänker till ordentligt, men är flödet i koden tydligt även med goto så kör på
Citera
2012-10-24, 14:38
  #26
Medlem
Det som break egentligen gör är ju helt enkelt en "goto end", så vad är egentligen skillnaden? Tyvärr kan man ju inte breaka ut ur mer än en loop, så är goto väldigt smidigt.

Kod:
while(blabla)
{
   if(tjosan)
       break;
}

är ju samma som:

while(blabla)
{
   if(tjosan)
       goto end;
}
end:


men om vi vill ha följande:
Kod:
while(tjosan)
  while(hejsan)
    while(nejdu)
      if(hejhopp)
        goto end;
end:
så blir det lite klurigare att klara sig utan.



Fast det ligger lite i det där att om man någonsin märker att det skulle vara bra med ett goto så har man troligtvis gjort något dumt från första början, även om det inte behöver vara så.
Citera
2012-10-26, 04:54
  #27
Medlem
klurigklurings avatar
Citat:
Ursprungligen postat av Ergodyne
En lite fråga vad ni tycker om att använda goto när man skriver c++

Jag fick alltid lära mig att man aldrig aldrig aldrig ska använda goto när man skriver c eller framförallt c++. Men på senare tid har jag stött på kod som använder det ganska flitigt.
Kul att stöta på den här diskussionen, för mig som är gammal i hönsgården.

GOTO fri programmering har varit het att diskutera redan på 70 talet för alla programmeringsspråk. Man skapade ”standards” för tillåtna/otillåtna sätt att använda GOTO, eller förbjuda det helt beroende på språkets faciliteter att skriva koden på annat sätt..

GOTO fick huvudskulden för att det finns bra, och det finns dåliga programmera som inte har lärt sig att strukturera upp problemet som de ska lösa på ett bra sätt. Det går alldeles utmärkt att skriva spagettiprogram, t o m överkokt spagetti som mera liknar gröt mer än spagetti alldeles helt utan GOTO.

Jag förespråkar inte användningen men vill heller inte förbjuda den. Det viktigaste är så klart att programmet fungerar annars är det värdelöst. Men lika viktigt är att programmet är lättläst och lätt att ändra även av andra än den som har skrivit programmet från början. För att lyckas skriva sådana program måste man lära sig ett antal metoder som inte har ett dugg med GOTO att göra.

Man kan faktiskt med lätthet ersätta en FOR loop med en elegant GOTO loop, om man vill, men varför skulle någon vettig vilja göra det? Självklart att man ska använda sig av finesser och funktioner som finns inbyggda i ett språk.
Citera
2012-10-26, 06:45
  #28
Medlem
Jag använder goto flitigt i C. Mest för att avbryta till slutet av funktionerna vid fel.
[PHP]int main(void) {

int ret = 1; /* assume failure */
char* string = NULL;

if ((string = malloc(10)) == NULL) {
fprintf(stderr, "memory allocation error\n");
goto exit_main;
}

if (!test) {
fprintf(stderr, "test failed\n");
goto exit_main;
}

ret = 0;

exit_main:

if (string) free(string);

return ret;

}[/PHP]

Det går att fixa utan gotos, men jag tycker att detta är betydligt enklare och överskådligare.
Citera
2012-10-26, 07:08
  #29
Medlem
kh31d4rs avatar
Citat:
Ursprungligen postat av 51mon
Men om man har extremt nästlad kod, typ 4 for-lopar eller så. Kan det inte var smidigt med goto då, om man vill bryta mitt i koden.
Om du har 4 nästlade for-loopar bör du nog se över din kod istället för att göra det ännu värre genom att lägga till goto.
Citera
2012-10-26, 07:56
  #30
Medlem
Citat:
Ursprungligen postat av FaderBerg
Jag använder goto flitigt i C. Mest för att avbryta till slutet av funktionerna vid fel.
[PHP]int main(void) {

int ret = 1; /* assume failure */
char* string = NULL;

if ((string = malloc(10)) == NULL) {
fprintf(stderr, "memory allocation error\n");
goto exit_main;
}

if (!test) {
fprintf(stderr, "test failed\n");
goto exit_main;
}

ret = 0;

exit_main:

if (string) free(string);

return ret;

}[/PHP]

Det går att fixa utan gotos, men jag tycker att detta är betydligt enklare och överskådligare.

Utan gotos då... vet inte hur det här ska grupperas på ett lättläst sätt:

Kod:
int main(void) {

    int   ret = 1; /* assume failure */
    char* string;

    if ((string = malloc(10)) != NULL) {
        if (test) {
            ret = 0; /* made it all the way! */
        } else {
            fprintf(stderr, "test failed\n");
        }
        free(string);
    } else {
        fprintf(stderr, "memory allocation error\n");
    }

    return ret;

}
Citera
2012-10-27, 12:25
  #31
Medlem
Citat:
Ursprungligen postat av patwotrik
Det som break egentligen gör är ju helt enkelt en "goto end", så vad är egentligen skillnaden? Tyvärr kan man ju inte breaka ut ur mer än en loop, så är goto väldigt smidigt.

Kod:
while(blabla)
{
   if(tjosan)
       break;
}

är ju samma som:

while(blabla)
{
   if(tjosan)
       goto end;
}
end:


men om vi vill ha följande:
Kod:
while(tjosan)
  while(hejsan)
    while(nejdu)
      if(hejhopp)
        goto end;
end:
så blir det lite klurigare att klara sig utan.



Fast det ligger lite i det där att om man någonsin märker att det skulle vara bra med ett goto så har man troligtvis gjort något dumt från första början, även om det inte behöver vara så.
Java, som saknar goto, har break med label så att man kan bryta sig ur flera loopar. I praktiken inte bättre än en goto använd på samma sätt. Ser då ut på det här viset:
Kod:
label: while(tjosan)
          while(hejsan)
            while(nejdu)
              if(hejhopp)
                break label;

Jag undrar dock vad alternativet är. Att sätta de inre looparna i en funktion och använda return?
Citera
2012-10-27, 12:46
  #32
Medlem
Det enda skälet till att lärare och böcker säger att man skall undvika goto är för att de inte vill skapa "basic"-programmerare av de som aldrig programmerat förut och som håller på att lära sig.
Citera
2012-10-27, 13:48
  #33
Medlem
Citat:
Ursprungligen postat av kh31d4r
Om du har 4 nästlade for-loopar bör du nog se över din kod istället för att göra det ännu värre genom att lägga till goto.
Visserligen sant, men ibland går det knappt att undvika, och det blir inte per definition sämre av goto.
Citat:
Ursprungligen postat av 770310
Utan gotos då... vet inte hur det här ska grupperas på ett lättläst sätt:

Kod:
int main(void) {

    int   ret = 1; /* assume failure */
    char* string;

    if ((string = malloc(10)) != NULL) {
        if (test) {
            ret = 0; /* made it all the way! */
        } else {
            fprintf(stderr, "test failed\n");
        }
        free(string);
    } else {
        fprintf(stderr, "memory allocation error\n");
    }

    return ret;

}
Ja inte tyckte jag det blev bättre. Jag föredrar gotovarianten.
Citera
2012-10-27, 19:25
  #34
Medlem
Citat:
Ursprungligen postat av Obeskrivlig
Java, som saknar goto, har break med label så att man kan bryta sig ur flera loopar. I praktiken inte bättre än en goto använd på samma sätt. Ser då ut på det här viset:
Kod:
label: while(tjosan)
          while(hejsan)
            while(nejdu)
              if(hejhopp)
                break label;

Jag undrar dock vad alternativet är. Att sätta de inre looparna i en funktion och använda return?

Att börja med att fundera på om det skulle passa bättre i en funktion, kan väl inte vara fel. Ett annat sätt, om hejhopp är enkelt (och kan faila fler gånger än en):

Kod:
while (tjosan) {
  while (hejsan) {
    while (nejdu) {
      if (hejhopp) break;
    }
    if (hejhopp) break;
  }
  if (hejhopp) break;
}

Annars med en variabel:

Kod:
int hejhoppIsTrue = 0;
while (tjosan) {
  while (hejsan) {
    while (nejdu) {
      if (hejhopp) {
        hejhoppIsTrue = 1;
        break;
      }
    }
    if (hejhoppIsTrue) break;
  }
  if (hejhoppIsTrue) break;
}

Och om if-break:arna tursamt nog ligger sist i looparna:

Kod:
int hejhoppIsFalse = 1;
while (hejhoppIsFalse && tjosan) {
  while (hejhoppIsFalse && hejsan) {
    while (nejdu) {
      if (hejhopp) {
        hejhoppIsFalse = 0;
        break;
      }
    }
  }
}

Byt ut hejhoppIsFalse mot t.ex. !inputErrorOccured eller !socketDied så är det mer lättläst än det verkar.
__________________
Senast redigerad av 770310 2012-10-27 kl. 19:27.
Citera
2012-10-28, 04:39
  #35
Medlem
MeanMEs avatar
@770310

Det var elegant.
Citera
2012-10-28, 08:25
  #36
Medlem
klurigklurings avatar
Citat:
Ursprungligen postat av zynius
Det enda skälet till att lärare och böcker säger att man skall undvika goto är för att de inte vill skapa "basic"-programmerare av de som aldrig programmerat förut och som håller på att lära sig.

Det ligger något i det. Det har funnits många tidiga basicdialekter framtagna i utbildningssyfte som saknade andra möjligheter än GOTO och GOSUB + RETURN för att skapa loopar. Fördelen var väl att detta skapade programmerare som tvingades in i ett strukturerat tänkande. De som inte klarade av det gav upp relativt snabbt.

Inget fel att vara ”basic” programmerare. Vad det handlar om i grunden är att kunna styra programflöden med hjälp av syntaxen i det aktuella språket som är tillgänglig.

Med hjälp att grundpelarna i programmeringsspråken för skapade av föden kan man lösa vilka komplicerade problem som helst även med hjälp av primitiva språk.

Sekvens – Iteration – Selektion.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in