The output is undefined because commas in a function argument list don't act as sequence points. The rule states that if you modify an object, it may be modified only once between sequence points and only accessed to determine the new value. Your printf() statement breaks the latter part of that rule.
Even if it weren't undefined, the behavior would be unspecified because functions are allowed to push arguments in any order. The output could just as easily be 15,1,0 as 15,0,1 depending on whether the b=15 expression is pushed first or last.
the parameters taking of printf function is from right to left.....
Don't confuse how C works on your implementation with how C is specified to work. There's no requirement that parameters be pushed right to left. They could be pushed left to right, or evens then odds, or staggered using the Fibonacci sequence (though right to left and left to right are the most common ;)).
So first it executes the condition b<9 but here b=1
next it executes the condition b>9. Here also b=1
How can b be both less than and greater than 9? Are you using New Math?
i get this but why it happens only in case of printf???
It doesn't happen only with printf():
void foo(int a, int b, int c)
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
int val = 1;
/* Beware! Here be dragons (nasal demons) */
foo(val = 15, val > 9, val < 9);