为什么变量在比较时会变为零?

时间:2018-06-12 14:26:57

标签: c random comparison

我有以下代码。问题在于变量r,它首先保存1-10之间的随机数。之后,它在循环内与用户输入数进行比较。当用户猜出随机生成的数字时,循环结束。

我使用short类型作为猜测,int作为随机生成的数字r。关键是在用户第一次猜测后,r变为0,我不知道为什么。如果guessint,则不会发生此问题。

#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: 

1 个答案:

答案 0 :(得分:4)

问题在于:

scanf("%d",&guess);

变量guessshort,但%d的{​​{1}}格式说明符需要指向scanf的指针。使用错误的格式说明符intprintf会调用undefined behavior

最有可能发生的事情是系统上的scanf大于int,导致在short所在的内存中写入字节,覆盖附近的变量,在此情况1}}。但是,这种行为无法保证,并且可能会因看似无关的代码更改而发生变化。

使用正确的格式说明符:

guess

或者将r的类型更改为scanf("%hd",&guess); 。由于没有真正的理由在这里使用guess,我建议使用后者。