在我最近开始学习C的过程中,我所做的第一件事就是一个非常基本的“2数字程序之和”。
/* Basic addition prog */
#include <stdio.h>
int main(void) {
int v_1; /* first var */
int v_2; /* second var*/
int answer; /* Sum of 2 vars*/
printf("Simple addition calculator \n");
printf("enter first number: ");
scanf("%d", &v_1);
printf("enter second number: ");
scanf("%d", &v_2);
answer = v_1 + v_2;
printf("%d\n", answer);
}
当我运行这个并输入2个数字时,一切运行正常,我会得到正确的答案。 输出结果如下:
输入第一个数字:1
输入第二个数字:1
= 2
我决定尝试通过使用字母而不是数字来打破它,因为我首先要输入2个字母,然后将它们转换为数字值,否则会出错并崩溃。
然而,这不是发生的事情而是我得到以下内容:
输入第一个数字:a
输入第二个数字:= 32765
我的问题不是“如何解决这个问题”,因为它“实际上发生了什么?”
修改 同样,这个问题更多的是试图了解正在发生的事情,而不是试图解决问题。我不是在寻找“如何避免这种情况?”我正在寻找“导致它的原因和原因?”
铊;博士 我真的可以简化我想知道的2个问题。
为什么我输入的字母表中每个字母的唯一垃圾数据? 即每次进入a时32767,而每次进入b时都是32767
为什么跳过第二个变量输入?
答案 0 :(得分:3)
检查scanf("%d", &v_1);
的结果。如果不是1,则v_1
不会更新。
为什么跳过第二个变量输入?
为scanf("%d", &v_1);
输入非数字输入既不会消耗该输入也不会更改v_1
。
这也是scanf("%d", &v_2);
没有等待输入的原因,它试图使用相同的输入并且也失败了。
为什么我输入的字母表中每个字母的唯一垃圾数据?即每次进入a时32767,而每次进入b时都是32767
代码只是获取v_1, v_2
的未初始化值。在v_1
之前,优化编译器甚至可能不会“创建”scanf("%d", &v_1);
,因此未初始化的v_1
可能依赖于输入的文本。由于这是未定义的行为,结果可能明天或另一台机器上有所不同。
使用初始化值尝试相同的操作。
int v_1 = 0; /* first var */
int v_2 = 0;