"for" statement issue

RazvanN via Digitalmars-d digitalmars-d at puremagic.com
Fri Oct 21 06:18:19 PDT 2016


On Friday, 21 October 2016 at 12:34:58 UTC, Andrei Alexandrescu 
wrote:
> I got a question about what happens with this code:
>
> int j;
> for({j=2; int d = 3; } j+d<7; {j++; d++;}) {
> }
>
> My first instinct was that that won't compile but it 
> surprisingly does. And it loops forever.
>
> So the grammar according to 
> https://dlang.org/spec/grammar.html#ForStatement is:
>
> ForStatement:
>     for ( Initialize Testopt ; Incrementopt ) ScopeStatement
>
> Initialize:
>     ;
>     NoScopeNonEmptyStatement
>
> NoScopeNonEmptyStatement:
>     NonEmptyStatement
>     BlockStatement
>
> NonEmptyStatement goes over a bunch of odd places such as case 
> statement and default statement. And then BlockStatement is the 
> matched case:
>
> BlockStatement:
>     { }
>     { StatementList }
>
> So it seems we have another case in which "{" "}" do not 
> introduce a scope. Fine. The real problem is with the increment 
> part, which is an expression. The code { j++; d++; } is... a 
> lambda expression that never gets used, which completes a very 
> confusing sample.
>
> What would be a good solution to forbid certain constructs in 
> the increment part of a for statement?
>
>
> Thanks,
>
> Andrei

I am the one who raised the question. I am n00b when it comes to 
D language (I just started reading about it a couple of days ago) 
and I tried the above mentioned code expecting that either the 
variables j and d get incremented accordingly or at least
I would get a compilation error. Instead, the program compiles 
and when run it sticks
into an infinite loop. I haven't read anything about lambda 
functions in D, but the
current outcome is very confusing for a beginner like myself.

Thanks,
RazvanN


More information about the Digitalmars-d mailing list