为什么我的if else语句没有显示其中一个条件的结果?

时间:2017-02-10 02:07:39

标签: c boolean

我一直在疯狂地试图弄清楚为什么第一个if语句(如果饿是真或假)将不会显示相应的响应。如果你看到真或假,它就不会打印声明。我觉得这是一个愚蠢明显的错误...但我无法发现它。 ---- ---- EDIT

它不会显示任何第一个条件/ if语句(饥饿) 如果你输入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");
    }

} 

2 个答案:

答案 0 :(得分: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 :(得分: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.