If else 语句在 C 中不起作用

If else statement doesn't work in C

#include<stdio.h>

void main()
{
    //Declaration
    char grade[1];

    //Data Input
    enter code here
    printf("Enter a grade{A,B,C,D,F]: ");
    scanf("%c",&grade);

    //If Statement

    if(grade=='a'=='A')
        printf("The score for the grade 'A' is 4.00");
    else
        if(grade=='b '=='B')
            printf("The score for the grade 'B' is 3.00");
        else
            if(grade=='c'=='C')
                printf("The score for the grade 'C' is 2.00");
            else
                if(grade=='d'=='D')
                    printf("The score for the grade 'D' is 1.00");

我试了很多次,就是没有弹出if else语句 我试图让程序识别 A-F 或 a-f 等级的大写和小写。但它似乎没有用

输入成绩{A,B,C,D,F]:a

进程返回 1 (0x1) 执行时间:2.599 秒 按任意键继续。

给我这个

它不会失败。你的比较失败了。你是说:

If (grade is equal to 'a') is equal to'A'....

这永远不可能是真的。尝试:

if(grade == 'a' || grade == 'A')...

仔细观察:

if(grade=='a'=='A')

相同类型的运算符从左到右,因此与

相同
if ((grade == 'a') == 'A')

因此您正在比较 grade'a''A' 的比较结果。这没有任何意义。

if(grade=='a'=='A')

不做你想做的事——它评估 grade == 'a',它是真 (1) 或假 (0),然后比较 that 值反对 'A',这 永远不会 是真的 1.

您通常会像这样处理多重比较:

if ( grade == 'a' || grade == 'A' ) // grade equals 'a' OR grade equals 'A'

但是,正确 处理不区分大小写比较的方法是使用 touppertolower 库函数之一将所有内容转换为大写或小写:

#include <ctype.h>
...
if ( tolower( grade ) == 'a' )

如果 grade 输入为 'A'tolower( grade ) 的结果将是 'a'。如果 grade 输入为 'a'tolower( grade ) 的结果将是 'a'。这样您只需要与单个值进行比较。

此外,您可能需要考虑使用 switch 控制结构而不是 if-else 语句链:

switch( tolower( grade ) )
{
  case 'a' : printf( "Score for grade A is 4.00\n" ); break;
  case 'b' : printf( "Score for grade B is 3.00\n" ); break;
  case 'c' : printf( "Score for grade C is 2.00\n" ); break;
  case 'd' : printf( "Score for grade D is 1.00\n" ); break;
  case 'f' : break;
  default  : printf( "%c is not a valid grade\n", grade ); break;
}

这样您只需计算 tolower( grade ) 一次,您的代码就不会遍历整个页面。

其他随机尼特...

  1. mainreturns int,不是void。你的编译器可能会也可能不会抱怨它,但你不应该使用 void main()。如果您的程序不接受任何命令行参数,请使用 int main( void ),如果需要,请使用 int main( int argc, char **argv)

  2. 写字符常量时要小心 - 'b ''b' 不同,可能不会按您期望的方式处理。

  3. %c 转换说明符与 scanf 一起使用时要小心。与 %s%d 以及 %f 转换说明符不同,它不会跳过任何前导白色 space。这在进行交互式输入时尤其危险,因为它会从之前的输入中拾取尾随的换行符。为确保跳过前导白色 space,请在说明符前面的格式字符串中放置一个空白 space:scanf( " %c", &grade );

  4. 检查 scanf 的结果以确保您在尝试处理之前确实阅读了一些内容。 scanf 将 return 成功转换和赋值的次数(如果输入与转换说明符不匹配则为 0)或 EOF 如果存在输入错误。


  1. 好吧,除非您找到一个将 'A' 编码为 1 的系统,否则您不会这样做,即使您这样做了,这也意味着所有剩余的测试仍然会因同样的原因而失败。