There are two things your example code requires us to consider:
The function arguments order of evaluation is unspecified. Therefore, either ++a
or a++
is evaluated first but it is implementation-dependent.
Modifying the value of a
more than once without a sequence point in between the modifications is also undefined behavior.
Because of point 2, you have double undefined behavior here (you do it twice). Note undefined behavior doesn't mean nothing happens; it means anything can happen.
call(a,a++,++a); /* UB 1 */
printf("****%d %d %d***_\n",a,a++,++a); /* UB 2 */