@bprosman: inderdaad, een case is een verkapte goto, maar die is wel veel leesbaarder, omdat de cases binnen de scope van de switch staan, en je dus nooit terug springt (omhoog in de code), of ergens anders waarvoor je het label moet gaan zoeken. Je maakt maximaal 2 jumps, de eerste van het begin van de switch naar de juiste case, en vanaf daar (als het niet de default of een on-afgesloten case was) naar het eind van de switch. Het eindpunt is altijd hetzelfde, en de jump is altijd vooruit, binnen een beperkte scope.
Ik ben het helemaal met hardbass eens; in 25 jaar C programmeren heb ik exact 0 keer een goto gebruikt of nodig gehad.
Ook ik doe vaak aan het begin van een functie wat sanity checks met een return. Dat heeft als voordeel dat het direct duidelijk is waar je heen gaat (terug naar waar de functie werd aangeroepen), en in de rest van de functie weet je dat de sanity checks goed waren, anders was je nooit verder gekomen in die functie.
Strikt genomen is zo'n return eigenlijk ook een jump naar de gegenereerde code aan het eind van de functie die de stack weer opruimt en zo. Daarnaast heb je nog break en continue, waarmee je uit een loop kunt springen, of juist het uitvoeren van de huidige iteratie onderbreekt, en verder gaat bij de volgende iteratie. Ook die probeer ik altijd te vermijden, afgezien van de break in een switch case, want daar zijn ze gewoon verplicht (wat ik overigens een vreselijk lelijke constructie vind).
In vrijwel alle gevallen waar je een goto zou gebruiken, kan het ook zonder, wat de leesbaarheid van de code doorgaans veel beter maakt, en mogelijke fuckups voorkomt.
Voorbeeld:
code:
if( a > 2 ) goto TEGROOT;
function( a );
TEGROOT:
kun je beter schrijven als
code:
if( a <= 2 )
function( a );
Het enige "redelijke" argument dat ik ook vóór een goto heb gehoord, is als je aan het eind van de functie nog dingen moet opruimen, ongeacht of je de taak van de functie hebt kunnen volbrengen of niet, maar ook daar zijn altijd betere oplossingen voor.
Kortom: als je een goto nodig hebt, doe je gewoon fundamenteel iets fout. Soms is het alternatief om een vlaggetje te zetten en die verderop te testen.
Voorbeeld:
code:
char SanityCheck = 1;
if( a > 2 )
SanityCheck = 0;
if( weekday == Sunday )
SanityCheck = 0;
if( SanityCheck )
function( a );
cleanup();
Voor het geval iemand het niet met me eens is: geef eens een voorbeeld waar "goto" redelijkerwijs de beste oplossing is, ik ben oprecht benieuwd.