Обычно, когда выражение имеет определенный числовой тип, и его контекст ожидает другой числовой тип, соответствующее преобразование произойдет автоматически.Это применимо в таких случаях, как:
void f(float);
void g(long);
int i = 3;
f(i); /*function call, with a prototype in scope*/
g(i); /*ditto*/
double d = i; /*assignment*/
Этот принцип также применим к выражению return
инструкция.
Этот принцип не применим к функциям с переменным числом, таким какprintf
.Причина в том, что правильные преобразования зависят от строки формата, и компилятору не требуется анализировать строку формата;фактически, если формат не является строковым литералом, компилятор обычно не может его проанализировать.Таким образом, все приведения необходимы в следующем printf
вызове:
int i = 3;
float f = 1.5;
printf("%ld %f %d\n", (long)i, (double)i, (int)f);
Однако из-за повышений (char
и short
повышаются до int
, float
повышается до double
) и к тому факту, что %c
ожидает int
, в следующем printf
вызове нет необходимости в приведениях:
char c = 'a';
float f = 1.5;
printf("%c %d %f", c, c, f);