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.