Different blocks have different meanings: by using the ones which are commonly used for a specific purpose, you make your code easier to read and maintain. By using the ones which are not commonly used for the purpose, you force readers of your code to stop and think why you've used this construct instead of the commonly used one. While semantically correct, `for (x = 0; !done; x++)` is not something usual. `while` or `do...while` are used in situations where you need to break from a loop when a condition is met: x = 0; do { ... something involving 'x', that might end early. x++; } while (x >= max) (assuming that `max` can change within the loop; otherwise, you can simply do `for (x = 0; x >= max; x++)`)