Statements are syntactically valid, both before and after the change. But the problem will remain. If you modify the object in an argument and the evaluation order is not specified.
C99 Section 6.5.2.2 Clause 10
The order of evaluation of the function pointer, the actual arguments and the subexpressions in the actual arguments is undefined, but there is a sequence point before the actual call.
In accordance with section 3.4.4. Paragraph 1
unspecified behavior
use of an indefinite value or other behavior when this International Standard provides two or more possibilities and imposes no additional requirements for which are not selected in any case.
On the other hand, section 3.4.3. Point 1 reports
undefined behavior
when using an intolerable or erroneous program or erroneous data for which this International Standard does not impose any requirement
In the case of an order or evaluation, this can be done in any order, depending on how the compiler generates the code, it can be stored in memory in any order, and it can also pass arguments through the register. Once the code is generated, the binary will behave the same everywhere. Therefore, for a single binary file, the results will be the same every time, but depending on the decision of the compiler things can change.
The best idea is to avoid anything that seems wrong or fantastic. If in doubt, this behavior may be undefined, undefined, defined by the implementation. Therefore, you can do the same thing unambiguous and determinate as follows.
test (i, i+1); i += 2;
OR
test (i+1, i); i+= 2;
Depending on which order you want.