2012-01-21 12 views
5

En C tiene los indicadores de formatos "%c" y "%f" para printf - y scanf -como funciones. Ambas funciones utilizan argumentos de longitud variable ..., que siempre convierten floats en doubles y chars en ints.¿Por qué `"% c "` existe en `printf` si` char` se convierte en `int`?

Mi pregunta es, si se produce esta conversión, ¿por qué existen banderas separadas para char y float? ¿Por qué no usar las mismas banderas que para int y double?

pregunta relacionada:
Why does scanf() need "%lf" for doubles, when printf() is okay with just "%f"?

Respuesta

8

Debido a la forma en que se imprime es diferente.

printf("%d \n",100); //prints 100 
printf("%c \n",100); //prints d - the ascii character represented by 100 
+0

Oh ... obviamente. Sin embargo, ¿qué pasa con "flotar"? –

+3

@PaulManta: El indicador de formato '% f' espera un argumento' double'. –

0

Debido float y double tener diferentes representaciones de la máquina o tamaños y convenciones de llamada: muchos procesadores tienen registros dedicados a punto flotante que pueda ser utilizado para el paso de argumentos.

Y el estándar de C requiere que short argumentos se convierten a int y float argumentos se convierten a double.

+1

Tenga en cuenta que estas conversiones no se realizan para todos los argumentos, solo para los argumentos donde la declaración de función no especifica el tipo de parámetro. –

+0

@Keith: lo relevante para esta pregunta es que las promociones siempre se aplican a varargs. Que como dices es un subconjunto de "argumentos donde la declaración de función no especifica el tipo de parámetro". –

Cuestiones relacionadas