Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is while (true) with break bad programming practice?

I often use this code pattern:

while(true) {      //do something      if(<some condition>) {         break;     }  }    

Another programmer told me that this was bad practice and that I should replace it with the more standard:

while(!<some condition>) {      //do something  }    

His reasoning was that you could "forget the break" too easily and have an endless loop. I told him that in the second example you could just as easily put in a condition which never returned true and so just as easily have an endless loop, so both are equally valid practices.

Further, I often prefer the former as it makes the code easier to read when you have multiple break points, i.e. multiple conditions which get out of the loop.

Can anyone enrichen this argument by adding evidence for one side or the other?

like image 507
Edward Tanguay Avatar asked Dec 24 '08 00:12

Edward Tanguay


People also ask

Is using while true bad practice?

Thanks for your answers. while (true) is not inherently bad practice. Certain uses of while (true) are bad practice, mostly busy-waits where other kinds of waits would be more appropriate, but there's nothing wrong with while (true) itself.

Is using break in code bad practice?

Using break as well as continue in a for loop is perfectly fine. It simplifies the code and improves its readability.

Is it bad to use break in a while loop?

Break and continue are OK unless you have several of them in the loop which becomes confusing. The need to avoid multiple returns has been obviated by shorter functions, which are the norm now.

When should I use while true?

While loop is used to execute a block of code repeatedly until given boolean condition evaluated to False. If we write while True then the loop will run forever.


2 Answers

There is a discrepancy between the two examples. The first will execute the "do something" at least once every time even if the statement is never true. The second will only "do something" when the statement evaluates to true.

I think what you are looking for is a do-while loop. I 100% agree that while (true) is not a good idea because it makes it hard to maintain this code and the way you are escaping the loop is very goto esque which is considered bad practice.

Try:

do {   //do something } while (!something); 

Check your individual language documentation for the exact syntax. But look at this code, it basically does what is in the do, then checks the while portion to see if it should do it again.

like image 90
Andrew G. Johnson Avatar answered Sep 19 '22 17:09

Andrew G. Johnson


To quote that noted developer of days gone by, Wordsworth:

...
In truth the prison, unto which we doom
Ourselves, no prison is; and hence for me,
In sundry moods, 'twas pastime to be bound
Within the Sonnet's scanty plot of ground;
Pleased if some souls (for such their needs must be)
Who have felt the weight of too much liberty,
Should find brief solace there, as I have found.

Wordsworth accepted the strict requirements of the sonnet as a liberating frame, rather than as a straightjacket. I'd suggest that the heart of "structured programming" is about giving up the freedom to build arbitrarily-complex flow graphs in favor of a liberating ease of understanding.

I freely agree that sometimes an early exit is the simplest way to express an action. However, my experience has been that when I force myself to use the simplest possible control structures (and really think about designing within those constraints), I most often find that the result is simpler, clearer code. The drawback with

while (true) {     action0;     if (test0) break;     action1; } 

is that it's easy to let action0 and action1 become larger and larger chunks of code, or to add "just one more" test-break-action sequence, until it becomes difficult to point to a specific line and answer the question, "What conditions do I know hold at this point?" So, without making rules for other programmers, I try to avoid the while (true) {...} idiom in my own code whenever possible.

like image 28
joel.neely Avatar answered Sep 22 '22 17:09

joel.neely