¿Por qué la salida es diferente usando printf?

En algunos lugares, el comando printf("%f\n", 5 / 2); es diferente. ¿Por qué, y cómo arreglar eso?

 int main() { int a = 65; char c = (char)a; int m = 3.0/2; printf("%c\n", c); // output: A printf("%f\n", (float)a); // output: 65.000 printf("%f\n", 5 / 2); // output: 65.000 system("PAUSE"); printf("%f\n", 5.0 / 2); // output: 2.5000 printf("%f\n", 5 / 2.0); // output: 2.5000 printf("%f\n", (float)5 / 2); // output: 2.5000 printf("%f\n", 5 / 2); // output: 2.5000 system("PAUSE"); printf("%f\n", 5 / (float)2); // output: 2.5000 printf("%f\n", (float)(5 / 2)); // output: 2.0000 printf("%f\n", 5 / 2); // output: 2.0000 system("PAUSE"); printf("%f\n", 5.0 / 2); // output: 2.5000 printf("%d\n", m); // output: 1 printf("%f\n", 5 / 2); // output: 2.5000 system("PAUSE"); return(0); } 

5/2 da como resultado un número entero, no un número de punto flotante, y printf no se puede convertir automáticamente a otro tipo, como lo puede hacer una asignación. Si comstack con GCC, recibirá la advertencia “formato ‘% f’ espera un argumento de tipo ‘doble’, pero el argumento 2 tiene el tipo ‘int'”. (Sí, doble. Todos los flotantes se convierten en dobles antes de enviarse a una función de argumento variable como printf).

El argumento que ha enviado, un entero, no coincide con la cadena de formato %f . De acuerdo con el estándar C, esto causará lo que llama “comportamiento indefinido”, lo que significa que cualquier cosa puede suceder. Sin embargo, lo que suele suceder es que printf buscará el lugar en la memoria donde habría estado el número de punto flotante, si hubiera enviado uno como argumento, tomará todo lo que encuentre allí e lo interpretará como un número de punto flotante. . Dado que un int típico es de 32 bits, y un double típico es de 64 bits, printf tomará otros datos, ¡tal vez el número 65 de una llamada anterior!

Para solucionar el problema, envíe un número de punto flotante a printf, por ejemplo, utilizando 5.0/2 , (double)5/2 o 2.5 lugar de 5/2 .