c - 为什么我得到“使用未初始化的局部变量'猜测'”,即使我正在做与老师正在做的完全相同的事情?
问题描述
我正在做一些业余练习并遇到了这个错误:
#include <stdio.h>
int main(){
int answer = 5;
int guess;
while (guess != answer) {
printf("enter a number: ");
scanf_s("%d", &guess);
}
printf("you guessed the correct number which was 5!");
return 0;
}
这是非常简单的循环练习,但由于某种原因,即使我正在做与该视频while
中的老师告诉我做的完全相同的事情,它也无法正常工作。
我通过给出int guess
一个值来修复它,比如int guess = 0
.
但是为什么该代码在视频中有效,但在我的编译器中无效?
解决方案
这不是错误,而是编译器发出的警告。它告诉你,你正在访问一个未定义的值,因为你没有初始化你的变量。
未明确给出值的局部变量称为“未初始化”,因为它假定“已分配内存块中的任何内容”的值,这通常会导致垃圾值,而绝对不是您的值想。
第一个问题在循环中。根据“guess”中的垃圾值,它可能决定根本不运行您的循环(因为“guess”可能只是偶然保持值“5”)。
另一个问题是您对 scanf 的使用。如果输入的内容不符合您的要求(即不是数字),guess
将保持不变。有关详细信息,请参阅有关 scanf 的文档。
作为一个小轶事,我想说:我曾经有一个bool
(C++,应该只为真或假)变量在某些情况下未初始化。
然后,在路上,它被检查了if (!variable)
,在 else 条件下它显示为else if (variable == true)
。它没有进入任何一个分支,因为正如调试器所揭示的那样,我的变量的值既不是真也不是假。它是 42。这就是未初始化变量所具有的危险。你永远不会知道你得到了什么。
推荐阅读
- javascript - 使用offSet在容器内定位对象
- ios - 在开发过程中更改 Apple 开发者帐户
- ios11 - 从应用程序内连接到 Wi-Fi 网络,无需访问互联网
- amazon-web-services - CIDR 无效 AWS Cloud Formation
- fiware - 我无法让 Orion 与 Cygnus 通信?
- python - 当 python-vlc 播放一些 HTTP 流时,get_time 不会按预期工作
- c - 三元算子交互的多个部分
- python - 比较两个列表以返回一个列表,其中所有元素都为 0,除了在保持索引时匹配的元素?
- node.js - 在 React 上使用来自 Youtube v3 API 的 maxResults
- openssl - 在不访问 PK 的情况下生成签名的 PKCS#7