Hi,<br><br>I've noticed that the modulus operator acts differently when the divisor is the length of an array and the dividend is negative.<br>For instance, this code:<br style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;" class="gmail_quote">

<br><div style="margin-left: 40px;">import std.stdio;<br>const int x = 4;<br>void main(){<br>    int[x] arr = [0, 1, 2, 3];<br>    <br>    writeln("Using arr.length");<br>    for(int i = -3; i <= 0; i++){<br>

        writefln("%d mod %d = %d", i, arr.length, i % arr.length);<br>    }<br>    writeln("Using x");<br>    for(int i = -3; i <= 0; i++){<br>        writefln("%d mod %d = %d", i, x, i % x);<br>

    }<br>}<br></div><br>Produces this output:<br><br><div style="margin-left: 40px;">Using arr.length<br>-3 mod 4 = 1<br>-2 mod 4 = 2<br>-1 mod 4 = 3<br>0 mod 4 = 0<br>Using x<br>-3 mod 4 = -3<br>-2 mod 4 = -2<br>-1 mod 4 = -1<br>

0 mod 4 = 0<br><br></div> Which is a useful (but undocumented?) feature that lets you loop through arrays backwards.<br>However, when the length of the array is odd...<br><div style="margin-left: 40px;">const int x = 3;<br>

...<br>int[x] arr = [0, 1, 2];<br></div>It looks like this:<br><br><div style="margin-left: 40px;">Using arr.length<br>-3 mod 3 = 1  <-- this should be 0<br>-2 mod 3 = 2  <-- this should be 1<br>-1 mod 3 = 0  <-- this should be 2<br>
0 mod 3 = 0<br>Using x<br>-3 mod 3 = 0<br>
-2 mod 3 = -2<br>-1 mod 3 = -1<br>0 mod 3 = 0<br><br></div>Does anyone know of a reason for this? It doesn't seem like a bug, but I don't know why it would do something like that.<br><br>Upon further investigation, I found that when arr.length is even, i acts like (x*(abs(i)/x + 1) + i) , and when arr.length is odd, i acts like (x*(abs(i)/x - 1) + i) <br>

<br>(I'm using dmd 2.049 on linux)<br><br><br>~Dave<br><div style="margin-left: 40px;"><br></div>