/ / ¿Por qué dar un especificador de formato de flotador a un entero asignado tiene un resultado de 0.000000? [cerrado] - c, printf, salida

¿Por qué dar un especificador de formato de flotador a un entero asignado es 0.000000? [cerrado] - c, printf, salida

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 № 1

Este 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.