Intenté dar un especificador de formato de flotador a unasigna un entero y da como resultado 0 y también si, en la misma declaración, otro float b dado un especificador de formato de entero, da un resultado absurdo y en la función surp
si trato de asignar el especificador de formato correcto a b, se traduce en 0. ¿Este especificador de formato incorrecto que se asignó inicialmente perturba toda la declaración?
Aquí está mi código:
#include<stdio.h>
#include<conio.h>
void main()
{
int i;
float b;
i=5;
b=3.5;
printf("%f and %dn",i,b);
surp();
}
int surp()
{
int i;
float b;
i=5;
b=3.5;
printf("%f and %fn",i,b);
}
Emite:
0.000000 y 1074528256 0.000000 y 0.000000
Respuestas
2 para la respuesta № 1Este código invoca un comportamiento indefinido en ambas llamadas a printf
, como te pareces a ser consciente. Cualquier cosa puede pasar, incluyendo la salida que observes.
printf("%f and %dn",i,b); // both i and b do not match
printf("%f and %fn",i,b); // i does not match
Debe proporcionar valores que coincidan con los especificadores de formato utilizados. No tiene sentido intentar razonar sobre el comportamiento indefinido que sigue cuando no haces esto.
Tu main
la función debe ser int main(void)
. Y el surp
La función se llama antes de que se declare, y en la implementación falta un return
declaración.
1 para la respuesta № 2
Intentar imprimir un entero como float es un comportamiento indefinido. Puede suceder cualquier cosa desde un bloqueo de programa a la salida que está obteniendo. Eso hace que no tenga sentido discutir.
por cierto
b=3.5;
Probablemente todavía no sea lo que quieres.
3.5
por defecto se interpreta como una double
literal, lo que significa que se lanzará implícitamente a un float
en esto, lo que lleva a redondeo adicional.
hacer
b = 3.5f;
en lugar
1 para la respuesta № 3
No sé por qué esperas resultados sensatos cuando estás provocando un comportamiento indefinido.
En ambos casos, está utilizando una flotación que especifica y pone un entero.
La cuestión es que esas variables tienen potencialmente diferentes tamaños, y las funciones deben consumirlas e interpretarlas adecuadamente. Usted podría estar muy bien provocando violaciones de memoria.
Por cierto, si estás usando gcc puedes usar -Wformat
cambie para que el compilador analice la sintaxis y escriba para usted y le dé una advertencia.