这是我编写的一个简单过程,目的是try 解决我在使用其他代码时遇到的问题.谁能告诉我为什么If语句默认为True?我读到一些关于scanf需要在变量前加空格的内容,但我做到了.

#include <stdio.h>
#include <stdlib.h>

int main(){

char answer;

printf("Y or N ");

scanf(" %c", &answer);

if(answer == 'Y' || 'y'){
   printf("you said yes \n");
}

else if (answer == 'N' || 'n'){
   printf("you said no \n");
}

else {
   printf("sorry, fail \n");
}

return 0;

}

不管我输入的是N还是n,或者其他任何字符,甚至是数字,它都会吐出"你说好的".

推荐答案

问题出在测试逻辑上.

if(answer == 'Y' || 'y')

这一说法并不像你想象的那样奏效.由于缺乏更好的表述方式,‘y’使您的程序的值为"true".

你最可能想要的是这样的对比测试:

if((answer == 'Y') || (answer =='y'))

请注意这一更正,以下是您的程序的重构版本.

#include <stdio.h>
#include <stdlib.h>

int main()
{

    char answer;

    printf("Y or N ");

    if (scanf("%c", &answer) != 1)
        return 1;

    if((answer == 'Y') || (answer =='y'))
    {
        printf("you said yes \n");
    }

    else if ((answer == 'N') || (answer == 'n'))
    {
        printf("you said no \n");
    }

    else
    {
        printf("sorry, fail \n");
    }

    return 0;

}

以下是在航站楼进行的一些测试.

craig@Vera:~/C_Programs/Console/ScanTest/bin/Release$ ./ScanTest 
Y or N U
sorry, fail 
craig@Vera:~/C_Programs/Console/ScanTest/bin/Release$ ./ScanTest 
Y or N Y
you said yes 
craig@Vera:~/C_Programs/Console/ScanTest/bin/Release$ ./ScanTest 
Y or N N
you said no 

总而言之,请注意逻辑上的"and"和"or"运算符在各种测试("if"、"While"等)中的工作方式.

C++相关问答推荐

C中的ATONE会扰乱SEN/CLUTE GMS应用程序中的其他字符串

Apple Libm的罪恶功能

在C语言中使用scanf()时我无法理解的警告

在C中使用动态内存分配找到最小的负数

为什么在4.9.37版的内核中,kfio还需要smp_wmb呢?

特定闪存扇区的内存别名

为什么STM32G474RE上没有启用RCC PLL

非常大的数组的大小

Char变量如何在不使用方括号或花括号的情况下存储字符串,以及它如何迭代到下一个字符?

GTK3按钮信号错误

这个空指针类型的转换是有效代码还是恶意代码?

For循环不会迭代所有字符串字符吗?(初学者问题)

通过对一个大的Malloc内存进行切片来使用Malloc的内存片

如何在C中定义指向函数的指针并将该指针赋给函数?

C编译和运行

即使我在C++中空闲,也肯定会丢失内存

共享内存未授予父进程权限

无法理解 fgets 输出

C/C++编译器可以在编译过程中通过按引用传递来优化按值传递吗?

为什么需要struct in_addr