C 为什么变量在比较时变为零?
我有下面的代码。问题在于变量C 为什么变量在比较时变为零?,c,random,comparison,C,Random,Comparison,我有下面的代码。问题在于变量r,它首先持有一个介于1-10之间的随机数。然后在循环内将其与用户输入的数字进行比较。当用户猜测随机生成的数字时,循环结束 我正在使用short类型进行猜测,而int用于随机生成的数字r。关键是,在用户第一次猜测之后,r变为0,我不知道为什么。如果guess是int,则不会发生此问题 #include <stdio.h> #include <time.h> #include <stdlib.h> int main(int argc
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;
}
问题在于:
scanf("%d",&guess);
变量guess
是short
,但是%d
格式说明符scanf
需要指向int
的指针。使用错误的格式说明符来printf
或scanf
调用
最可能发生的情况是,系统上的int
大于short
,导致写入内存中guess
所在位置的字节,覆盖附近的变量,在本例中为r
。然而,这种行为并不能得到保证,可能会随着看似无关的代码更改而改变
使用正确的格式说明符:
scanf("%hd",&guess);
或者将
guess
的类型更改为int
。因为这里没有真正的理由使用short
,所以我建议使用后者。“short guess”….“scanf”(%d),&guess);”Re:“如果guess是int,则不会发生此问题”。让我想起一个故事。男人去看医生,说:“嘿,医生,我这样做的时候很疼。”。医生回答说:“好吧,别这样做了。”——)提示:一个好的编译器如果启用了所有的警告,它将警告shortguess=-1;scanf(“%d”,猜测(&guess)代码>。通过启用所有警告来节省您自己(和我们)的时间,或者使用更好的编译器。非常感谢你!我为这个愚蠢的问题感到抱歉,我刚刚开始学习c。
scanf("%hd",&guess);