In cpp, the result of the following code snippet is: 5 5 5 But in java, the result of the same code snippet is: 3 5 7 I do not know why,
Because C++ ain't Java :)
You are mutating the variable v
in the last two function calls. Let's look at the dissassembly (debug here to see things more clearly, in release a static value of 5
is used, but it could also be 7
just as easily. You'll see why):
h.fn(v).fn(v=5).fn((v=7));
00411565 mov dword ptr [v],7
0041156C mov dword ptr [v],5
00411573 mov eax,dword ptr [v]
00411576 push eax
The order of expression evaluation is not guaranteed to be the order that you call the functions here. You are modifying v
between sequence points. 7
gets assigned to v
, then 5
, then the first function is called. Note that it doesn't have to be 7
and then 5
in that order, it could be swapped! The order of evaluation is unspecified, it could be anything.
You have a chain of functions which mutate v
twice. You cannot count on the fact that each mutation will occur in the order you typed it here.
We can simplify it. Let's say we have two functions; x
and y
that both return an int
. If I write:
int k = x() + y();
There is no guarantee that x()
will be called before y()
. So, if you are mutating an argument common to both functions then the mutation may occur in the call to y()
first, which is what you are seeing.