I ran this:
import std.stdio;
void main() {
int i = 10;
i = i++;
writeln(i);
}
with DMD32 D Compiler v2.063.2 and got '10'.
And for nothing other than curiousity, this in both VS2012, and
VS2013:
#include <iostream>
int main(int argc, char const *argv[])
{
int i = 10;
i = i++;
std::cout << i << std::endl;
return 0;
}
and got '11', both times.
On Friday, 28 March 2014 at 18:04:41 UTC, Frustrated wrote:
On Friday, 28 March 2014 at 16:54:49 UTC, Benjamin Thaut wrote:
I had a bug which came down to the following line today:
m_takeIndex = m_takeIndex++;
Actually this line does nothing. m_takeIndex remains at
exactly the same value as before (tested with dmd 2.065).
Can someone please explain why? And would be suitable to warn
about this, if it is correct behaviour?
Kind Regards
Benjamin Thaut
This should be invalid.
m_takeIndex++;
actually increments the variable.
m_takeIndex = m_takeIndex++; should do exactly the same.
It is a bug. It might be correct in monarch's world but it is
not logical. I think monarch is just trying to justify the way
D does it, regardless if D is D is wrong or not.
I imagine what is going on is that D is creating a temp
variable, assigning it to the local variable, then incrementing
the temp variable(since++ increments "after" the assignment).
That, or D really is treating that as a nop, which is wrong too.
Test case shows it is probably the first:
int j = 0, i = 0;
i = j++;
// i = 0, j = 1
hence D is wrong, Monarch is wrong, etc...
m_takeIndex = m_takeIndex++;
should, given the example above, evaluate to
m_takeIndex = m_takeIndex; (a nop)
m_takeIndex++; (variable incremented)
hence, D is not consistent with itself, which at the very least
is a bug.