Почему переменная меняется на ноль при сравнении? - PullRequest
0 голосов
/ 12 июня 2018

У меня есть код ниже.Проблема в переменной 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: 

1 Ответ

0 голосов
/ 12 июня 2018

Проблема здесь:

scanf("%d",&guess);

Переменная guess является short, но спецификатор формата %d для scanf ожидает указатель на int.Использование неправильного спецификатора формата для printf или scanf вызывает неопределенное поведение .

Скорее всего, произошло то, что int в вашей системе больше, чем short,приводя к записи в байты в памяти, где находится guess, с перезаписью ближайших переменных, в данном случае r.Это поведение, однако, не гарантируется и может измениться с внешне не связанными изменениями кода.

Либо используйте правильный спецификатор формата:

scanf("%hd",&guess);

, либо измените тип guess на int.Поскольку здесь нет реальной причины использовать short, я бы порекомендовал последнее.

...