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);