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

Timon Gehr timon.gehr at gmx.ch
Thu Aug 25 09:21:19 PDT 2011


On 08/25/2011 05:31 PM, Steven Schveighoffer wrote:
 > On Thu, 25 Aug 2011 11:15:44 -0400, Jonathan M Davis
 > <jmdavisProg at gmx.com> wrote:
 >
 >> On Thursday, August 25, 2011 07:11:31 Steven Schveighoffer wrote:
 >>> > On 08/25/2011 12:47 AM, Mafi wrote:
 >
 >>> >> I'm not really sure if it's good for 'while'.
 >>> >> I'm unsure because there are two somewhat natural semantics for
 >>> such a
 >>> >> construct.
 >>> >>
 >>> >> //example
 >>> >> //more to the nature of while
 >>> >> while(auto obj = init) { work(obj); }
 >>> >>
 >>> >> //1 (your interpretation)
 >>> >> typeof(init) obj;
 >>> >> while(obj = init) { work(obj); }
 >>> >>
 >>> >> //2
 >>> >> /*
 >>> >> seems more natural for me because init runs only once (like any 
other
 >>> >> init and like in 'for' or 'if')
 >>> >> */
 >>> >
 >>> I'd say just leave the auto x = y for if and for loops, where there 
is a
 >>> clear "run once" section.
 >>>
 >>> Also, what do you do with a do while loop if the while contains this
 >>> construct?
 >>>
 >>> I just find the whole thing confusing.
 >>
 >> I don't see why it would be confusing. Because it's unclear whether
 >> it's set
 >> every time or whether it's a new variable every time? It's actually
 >> one of
 >> those things that I do periodically thinking that it works and then get
 >> frustrated when it doesn't, so I'd love to see it added.
 >
 > See Mafi's response above.
 >
 > What it boils down to is, I usually replace code like this:
 >
 > auto x = condition;
 > if(x)
 > {
 > // use x
 > }
 >
 > with this:
 >
 > if(auto x = condition)
 > {
 > // use x.
 > }
 >
 > so the logical mapping to while would map this:
 >
 > auto x = condition;
 > while(x)
 > {
 > // use x.
 > }
 >
 > to this:
 >
 > while(auto x = condition)
 > {
 > // use x.
 > }
 >
 > But it looks like every time through the loop x gets reassigned to
 > condition. 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.
 >
 > -Steve

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.

-Timon


More information about the Digitalmars-d-learn mailing list