2017-02-10 1 views
0

Я водил себя сумасшедшим, пытаясь понять, почему первое утверждение if (если голодное истинно или ложно) не отображает соответствующий ответ. Если вы нажимаете true или false, это просто не печатает заявление. Я чувствую, что это глупая очевидная ошибка ... но я не могу это заметить. ---- EDIT ----Почему мое заявление if else не показывает результаты одного из условий?

Он не будет ничего для первого условия показа /, если оператор (голодный) Если положить в 1 или 0, он не будет отображаться prinft заявление, чтобы идти вместе с ним.

#include<stdio.h> 
#include<stdbool.h> 

int main (void){ 

_Bool hungry = 0; 
_Bool thirsty = 0; 
_Bool sleepy = 0; 


printf("Are you hungry? (1 - true 0 - false) : "); 
scanf("%d", &hungry); 

printf("Are you thirsty?: "); 
scanf("%d", &thirsty); 

printf("Are you sleepy?: "); 
scanf("%d", &sleepy); 


if (hungry) { 
    printf("Ordering manty \n"); 
} 
    if (thirsty) { 
     printf("Ordering pot of hot tea \n"); 
    } 
    else { 
     printf("Ordering cup of water \n"); 
    } 
    if (sleepy) { 
     printf("Ordering black coffee \n"); 
    } 
    else { 
    printf("Ordering baursaki \n"); 
    } 

} 
+1

"не будет отображаться соответствующий ответ". Так что же он делает? Пожалуйста, опишите * точный * ввод, ожидаемый выход и фактический вывод. – kaylum

+0

Это обыкновение отображать какой-либо ответ на первое условие (голодный) – MissAnnThropic

+0

Если поставить 1 или 0 я комментировал все из за (голодный), за исключением, если заявление и даже тогда он не будет отображаться заявлением PRINTF при входе 1 для истинного. Извините из-за отсутствия объяснения. – MissAnnThropic

ответ

2

Этот код вызывает неопределенное поведение:

_Bool hungry = 0; 
scanf("%d", &hungry); 

Формат %d спецификатор требует аргумент типа int *, но поставляется _Bool *. Семейство printf и scanf не выполняет никаких преобразований типов - программист должен убедиться, что указан правильный тип аргумента.

На самом деле нет никакого спецификатора формата для _Bool. Вы должны прочитать в другой переменной, а затем присвоить BOOL, например .:

int temp = 0; 
scanf("%d", &temp); 
hungry = temp; 

Вы хотели бы проверить возвращаемое значение из scanf, и, возможно, также проверить temp и принять меры, если вход был неожиданным.

1

sizeof(_Bool) равен 1, или 1 байт.

При попытке установить в него scanf-%d, вы пытаетесь поместить 4 байта в пространство, достаточно большое для одного байта. С этого момента у вас есть неопределенное поведение.

Я бы рекомендовал:

int temp;    // Temp is 4-bytes. (assuming 32-bit system) 
scanf("%d", &temp); // %d matches 4-byte int. 
hungry = !!temp;  // !! converts int value into _Bool value. 
Смежные вопросы