This is unspecified behavior. The order of evaluation of function arguments is not specified in the C standard, and therefore it could happen in any order.
People have already given you some links in the comments you can read on. But in short, there are things called "sequence points". These ensure that everything that needed to be executed before, is executed, and then the program can continue. Between two sequence points, the instructions can execute in any order.
From the C11 standard:
3.4.4:
unspecified behavior
use of an unspecified value, or other behavior where this International Standard provides
two or more possibilities and imposes no further requirements on which is chosen in any
instance
EXAMPLE An example of unspecified behavior is the order in which the arguments to a function are evaluated.
6.5.2.2.10 says
There is a sequence point after the evaluations of the function designator and the actual
arguments but before the actual call. Every evaluation in the calling function (including
other function calls) that is not otherwise specifically sequenced before or after the
execution of the body of the called function is indeterminately sequenced with respect to
the execution of the called function.
In other words, there is no sequence point between the evaluation of a function's arguments, therefore they may be evaluated in whichever order the compiler feels like.
To complete the answer, this is also undefined behavior, as you try to change the value of a
multiple times between two sequence points.
6.5.2:
If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar
object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.84)
84) his paragraph renders undefined statement expressions such as
i = ++i + 1;
a[i++] = i;
while allowing
i = i + 1;
a[i] = i;