usando - variable no declarada en condición de bucle for en C-still funciona
sentencia if en c++ (3)
Escribí el siguiente código para encontrar la suma de todos los dígitos en C , y cuando lo compilé y lo ejecuté, fue exitoso. Pero, más tarde, me di cuenta de que no había ingresado ningún valor para la variable '' n '' en la condición del bucle for. Estoy confundido sobre cómo funciona este programa, incluso cuando no hay ningún valor asignado a la variable de condición. Me gustaría que me aclaren lo mismo.
#include<stdio.h>
void main()
{
int no,a,b,n,sum=0;
printf("Enter the number to be added");
scanf("%d",&no);
for(int i=0;i<n;i++)
{
a=no%10;
b=no/10;
sum=a+sum;
no=b;
}
printf("The sum is %d",sum);
}
Estoy confundido sobre cómo funciona este programa
Bueno, "trabajos" es una observación / decisión muy pobre aquí. Este es un comportamiento indefinido .
Está intentando usar el valor de una variable local automática n
mientras está indeterminado . Esto invoca el UB.
Para citar el estándar C11
, capítulo §6.7.9
Si un objeto que tiene una duración de almacenamiento automática no se inicializa explícitamente, su valor es indeterminado. [...]
Por lo tanto, en su caso, n
cumple con los criterios descritos anteriormente y, por lo tanto, el contenido es indeterminado.
Ahora, después de eso, en caso de que trates de usar una variable mientras tenga un valor indeterminado y
- no tiene la dirección tomada
- puede tener una representación de trampa
el uso dará lugar a un comportamiento indefinido. Ese es exactamente el caso aquí.
Dicho esto, para un entorno alojado, la firma conforme de main()
es int main(void)
, al menos.
Una variable no inicializada DEBE contener algún valor: cada dirección en una computadora debe tener alguna combinación de 1 y 0, incluso si esos valores son inútiles. Por lo tanto, se le da uno al azar cuando se crea por primera vez si no lo inicializa a usted mismo. A menudo ni siquiera son datos "dados" tanto como "adquieren" cualquier valor en la dirección que se les dio para vivir cuando se crearon, pero diferentes entornos manejarán esta "no inicialización" de manera diferente. Básicamente estás teniendo suerte en este momento bajo tus condiciones actuales.
Por esa razón, se considera que este tipo de código tiene un comportamiento indefinido porque no se garantiza que tenga suerte en todas las situaciones. Sea seguro y siempre inicialice los valores de las variables porque puede ser difícil detectarlo más adelante cuando el código que solía funcionar de repente no lo hace.
n
no se inicializa, por lo que vale la pena cualquier cosa presente en la ubicación de la memoria asignada cuando se ejecuta. Entonces, si tienes suerte, después de algunas iteraciones, no
es 0
y el resultado es correcto, pero es solo suerte.
En su caso, no necesita n
, simplemente deténgase cuando la división rinda 0 (es probable que haya olvidado inicializar n
)
while(no!=0)
{
a=no%10;
b=no/10;
sum+=a;
no=b;
}