I have seen many question realting that but I still have a problem or misunderstanding of things. The standards says:
section 7.21.6/9 says
"If a conversion specification is invalid, the behavior is undefined.
If any argument is not the correct type for the corresponding
conversion specification, the behavior is undefined.".
printf("%d",c); // is this undefined behavior
No, your example is not undefined behaviour.
int is one of the default argument promotions. From the spec, 188.8.131.52 Function calls, paragraph 6:
the integer promotions are performed on each argument, and arguments that have type
floatare promoted to
The integer promotions are (from 184.108.40.206 Boolean, characters, and integers, paragraph 2):
intcan represent all values of the original type (as restricted by the width, for a bit-field), the value is converted to an
int; otherwise, it is converted to an
unsigned int. These are called the integer promotions. All other types are unchanged by the integer promotions.