我有下面的代码。问题在于变量 r
,它首先保存 1-10 之间的随机数。随后在循环内将其与用户输入的数字进行比较。当用户猜测随机生成的数字时,循环结束。
我使用 short
类型进行猜测,使用 int
类型进行随机生成的数字 r
。关键是,在用户第一次猜测后,r
变成了 0,我不知道为什么。如果 guess
是 int
,则不会发生此问题。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
srand(time(NULL));
int r = (rand()%10)+1;
short guess = -1;
printf("%d\n", r);
while ((guess)!= r){
printf("%d\n", (int) guess);
printf("%d\n", guess);
printf("%d\n", r);
printf("Give me a number from 1 to 10: ");
scanf("%d",&guess);
if (guess> r){
printf("The number is lower\n");
}
else if (guess<r){
printf("The number is higher\n");
}
else {
printf("Corrent!\n");
}
}
return 0;
}
输出示例如下:
7
-1
-1
7
Give me a number from 1 to 10: 5
The number is lower
5
5
0
Give me a number from 1 to 10:
最佳答案
问题出在这里:
scanf("%d",&guess);
变量 guess
是一个 short
,但 %d
格式说明符 scanf
期望一个指向一个int
。使用错误的格式说明符来 printf
或 scanf
调用 undefined behavior .
最有可能发生的情况是,您系统上的 int
大于 short
,导致写入内存中的字节超过猜测
> 驻留,覆盖附近的变量,在本例中是 r
。然而,这种行为并不能得到保证,并且可能会随着看似不相关的代码更改而改变。
使用正确的格式说明符:
scanf("%hd",&guess);
或者将guess
的类型更改为int
。由于没有真正的理由在这里使用 short
,我建议使用后者。
关于c - 为什么变量在比较时会变成零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50819611/