Reputation: 26071
When is a do-while the better choice over other types of loops? What are some common scenarios where its better than others?
I understand the function of a do-while, but not when to use it.
Upvotes: 16
Views: 5150
Reputation: 21
Normally when you need the user to input some value, the counter variable is based on the input value, you use do-while. //The following code is in C++. It requires the user to input a number and repeats until users input number larger than 0.
do{
cout << "Enter a Positive integer: ";
cin >> num;
}while( num < 0 );
Upvotes: 2
Reputation: 3917
Another exception when you are doing something recursive, like the following with reading inner exceptions:
catch(Exception exc)
{
Exception currentException = exc;
do
{
Console.WriteLine(string.Format("{0}: {1}", currentException.GetType().Name, currentException.Message));
} while((currentException = currentException.InnerException) != null);
}
Upvotes: 1
Reputation: 116471
When you need something done at least once, but don't know the number of times prior to initiating the loop.
Upvotes: 58
Reputation: 13244
No-one's yet mentioned its use in C macros...
#define do_all(x) do{ foo(x); bar(x); baz(x); } while(0)
then in the code you can have
do_all(a);
Upvotes: 5
Reputation: 1508
when reading from a file or waiting for a connection to be established (other human interaction as well), anything for what the number of iterations is not known a priori (e.g. number of records returned by an sql query), or when you do steps of different size (e.g. read 1 or 5 lines from the file depending on the last one read), when going over all combinations/permutations of objects, whenever 'for' loop conditions become cumbersome
Upvotes: 1
Reputation: 8744
I usually use a do-while when something needs to happen, but it won't necessarily happen "correctly" on the first time. For instance:
int x;
do
{
x = random.next(100);
cout << x << endl;
} while (x != 13);
In this case, the x you start with doesn't matter at all, because it's overwritten.
Upvotes: 4
Reputation: 43140
do while()
loops while a condition is true, but on the other hand, Pascal's repeat until
loops while a condition is false (both will run at least once).
When I program in Pascal I almost always use repeat until
.
When I program in C++ I almost always use while() {}
.
I can't explain why, but I feel it's normal. Weird?
Upvotes: 1
Reputation: 86306
I've long held that do-while is not used in C-based languages as much as it should be because the reuse of the "while" keyword is awkward and confusing. Pascal's repeat-until does not share any keywords with its while-begin-end structure.
I'd love to analyze a big heap of code someday and see if do-while is underrepresented in C code compared to similar constructs in other languages.
Upvotes: 1
Reputation: 60528
I've used it before if I need to implement lots of conditional checks, for example processing an input form in php. Probably not the best practice, but it's more readable than many alternatives:
do {
if ( field1_is_invalid ) {
$err_msg = "field1 is invalid"; break;
}
if ( field2_is_invalid ) {
$err_msg = "field2 is invalid"; break;
}
.. check half a dozen more things ..
// Only executes if all checks succeed.
do_some_updates();
} while (false)
Also, I guess this isn't technically a loop. More like a way of avoiding using GOTO :)
Upvotes: 3
Reputation: 829
It's appropriate when you would like to have your condition checked at the end of the loop execution. Hence the loop will always run at least once and then it will verify if it should iterate further.
Upvotes: 2
Reputation: 10278
When it is more appropriate to do something and then evaluate the boolean expression...or as Brian said...when you need something done at least once. This syntax moves the evaluation of the boolean expression to after the loop instead of before the loop.
Upvotes: 1
Reputation: 4470
It's not often that it's the best thing to use, but one scenario is when you must do something at least once, but any further iterations are dependent on some condition.
do {
//do something
} while ( condition );
Upvotes: 4