首页 > 解决方案 > 为什么我的 C 程序打印出垃圾值?

问题描述

在下面的程序中,我没有得到正确的答案。如果我输入“1”作为 的输入scanf-4200052则将打印结果。

下面是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main() {

int n;
int a = -n-4;
int square = n*n;
int b = square-7;

printf("ENTER AN INTEGER: ");
scanf ("%d" , &n);

if (n<3)
printf ("%d" , a);

else
{
   if (n >= 3 || n <= 10)
   printf ("%d" , b);
}

return 0;
}

我错过了什么吗?任何人都可以给我指点我做错了什么?

标签: c

解决方案


如果您自己不初始化变量,在C中,它们将不会被自动初始化(除非它们是static/global变量)。

当你这样做时会发生什么:

int a;

sizeof(int)是否为该变量名保留了一个内存地址块,但分配的地址实际上没有写入任何内容...这意味着该内存地址中包含的任何内容都不会被“擦除”或赋予任何值。

因此,很可能已经在该地址写入了某些内容,而您只是在读取已经存储在该内存地址的一些垃圾值。

就像从一堆剩余的杂志和报纸中选择一张你需要的大小的纸,你会在上面写一些东西。也许你想在那张纸上做你的数学作业,但是如果你试着阅读上面实际写的东西,在你写任何东西之前,你只会发现过时的新闻!

试验这段代码:

int main()
{

   int n;

   printf("Non-initialised n value: %d\n", n);

   int a = n + 1;

   printf("Value of n incremented by one: %d\n", a);

   n = 4;

   printf("Value of initialised n:\n", n);
   
   return 0;

}

现在清楚了吗?您正在读取 的值n,这是一个垃圾值(可能是过时的足球比赛结果?),而您实际上是在对该垃圾值做一些事情,其中​​:int a = -n-4;

所以,既然你知道了这一点,你也知道你可以通过确保所有操作n都在n被赋予适当的值之后执行来修复你的程序,所以......


int main()
{

   int n;

   printf("ENTER AN INTEGER: ");
   scanf("%d", &n);

   int a = -n - 4;
   int square = n * n;
   int b = square - 7;

   if (n < 3)
      printf("%d", a);

   else
   {
      if (n >= 3 || n <= 10)
         printf("%d", b);
   }
   return 0;
}

推荐阅读