On Wednesday, 14 July 2021 at 12:35:07 UTC, wjoe wrote:
> On Wednesday, 14 July 2021 at 11:31:36 UTC, Tejas wrote:
> {auto a = i[1] , ++i[1] , a} //note the , not the ;
Sorry I can't provide something even more concrete.
Yes I saw that, and I suppose it would work just fine if it were rewritten to just ++i[1]
.
What I'm struggling to understand is the {auto a = i[1], ... ,a}
part. I can't parse that. What's up with the assignment and the comma stuff ?
It's how the contract of post-inc/dec work---pre-inc/dec return the modified value, post-inc/dec return the original value.
int i = 1;
assert(++i == 2);
int j = 1;
assert(j++ == 1);
The rewrite of the compiler is done in such a way that the result of the expression is the original value. That's what the commas are for.
So you can parse that rewrite example as it if were a function, with each expression separated by a comma, and the final expression the result:
```d
int postInc(ref int j)
{
auto a = j;
++j;
return a;
}
It doesn't actually create a function, but this demonstrates the effect.
So that's why you don't have to worry about postfix/prefix for these. The compiler handles that behind the scenes. All you need to worry about is returning the incremented value.