goto a no-go?

qznc qznc at web.de
Tue Oct 1 04:36:13 PDT 2013


On Tuesday, 1 October 2013 at 11:22:12 UTC, Chris wrote:
> Just a short question. Usually goto statements are frowned upon 
> as being bad programming style (in textbooks at least). D has 
> it (thankfully) and I've used it, albeit sparingly. Sometimes 
> goto is simply the best and most efficient solution within a 
> code block (to avoid code duplication, unnecessary checks or 
> redirecting to yet another function blah blah). Is it ok or 
> even necessary to use goto in D? Or does the compiler recognize 
> _obvious_ cases and generate code accordingly? For example 
> would it turn something like this
>
> // ...
> if (word.length == 1) {
>  // format output
>  return output;
> } else if (word.length > 1) {
>   // do some additional processing
>   // format output
>   return output;
> }
>
> into
>
> // ...
> if (word.length == 1) goto FormatOutput;
>
> // if word.length > 1, some extra work has to be done
> // initialize some variables, parse, do some processing etc.
>
> FormatOutput:
>  // .....
>
> return output;

How is that transformation an optimization or improvement? 
Substituting "return output" for "goto FormatOutput" is not 
better. So, I assume "// format output" is the code duplication 
you want to remove? Well, your example should also work like this:

   if (word.length > 1) {
     // do some additional processing
   }
   // format output
   return output;

Regarding goto and D, scope guards [0] are good for removing 
gotos, because the cleanup-after-error code can be moved.

[0] http://dlang.org/statement.html#ScopeGuardStatement


More information about the Digitalmars-d mailing list