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.
```d
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.