c - 为什么我的 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中,它们将不会被自动初始化(除非它们是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;
}
推荐阅读
- r - 何在 R 中使用带有 tm 包的自定义词干算法?
- selenium - 与 Implicitwait 相比,我们是否需要为 ExplicitWait 声明更少的时间
- .net - Couchbase Mobile Client Lite 如何通过代理
- python - Django:如何通过模型方法设置默认字段值
- javascript - 为什么日历多个课程缺少右下角的蓝色三角形?
- supervisord - Supervisord:不要从 crond 杀死进程
- javascript - 如何使用 lodash 将对象中的数组数据与计数分组
- sql-server - SSIS:无法运行 sql 任务来更新表
- java - 错误的 SQL 语法 - 在此 ResultSet 中找不到列名?
- c - iscntrl 的行为是什么?