Why no (auto foo = bar) in while loops?

Steven Schveighoffer schveiguy at yahoo.com
Thu Aug 25 13:51:01 PDT 2011


On Thu, 25 Aug 2011 12:21:19 -0400, Timon Gehr <timon.gehr at gmx.ch> wrote:


>
> I usually replace code like this:
>
> x++;
> if(x < 100)
> {
>    // use x
> }
>
> with this:
>
> if(++x < 100) {
>      // use x
> }
>
> so the logical mapping to while would map this:
>
> x++;
> while(x < 100)
> {
>      // use x.
> }
>
> to this:
>
> while(++x < 100) {
>      // use x.
> }
>
>
> But it looks like every time through the loop x gets incremented.
> That's not what I'd want. At the very least, it's confusing
> semantics one way or the other.
>
> If you use the construct in the *init* section of a for loop, it reads
> the same as the if statement, since that part is only executed once.
>
> The while loop just doesn't fit the model. Let's ditch the while loop.

Not relevant, you are not declaring a variable in your example.  The  
benefit of using the auto x = y is that you can move the declaration of  
the variable, which is used only during the loop, into the loop statement.

I have written loops like this:

bool found = false;
while(!found)
{
   // things that might set found to true
}

There is also this construct, which is what you are arguing for:

bool continueloop;
while(continueloop = someComplexFunction())
{
   // use continueloop as rvalue in places
}

So there are legitimate cases for while(auto x = y) being a shortcut for  
both behaviors, hence the confusion.

I agree your case yields more fruit, since I think the above is actually  
invalid (can't use = as a boolean expression), but it doesn't stop me from  
being confused about whether the initialization happens once or every  
time.  It just reads like it happens once to me, even if it happens every  
loop.  That confusion isn't there for if statements or for loops.

-Steve


More information about the Digitalmars-d-learn mailing list