我一直在疯狂地试图弄清楚为什么第一个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");
}
}
答案 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.