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'
但是,正确 处理不区分大小写比较的方法是使用 toupper
或 tolower
库函数之一将所有内容转换为大写或小写:
#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 )
一次,您的代码就不会遍历整个页面。
其他随机尼特...
main
returns int
,不是void
。你的编译器可能会也可能不会抱怨它,但你不应该使用 void main()
。如果您的程序不接受任何命令行参数,请使用 int main( void )
,如果需要,请使用 int main( int argc, char **argv)
。
写字符常量时要小心 - 'b '
与 'b'
不同,可能不会按您期望的方式处理。
将 %c
转换说明符与 scanf
一起使用时要小心。与 %s
和 %d
以及 %f
转换说明符不同,它不会跳过任何前导白色 space。这在进行交互式输入时尤其危险,因为它会从之前的输入中拾取尾随的换行符。为确保跳过前导白色 space,请在说明符前面的格式字符串中放置一个空白 space:scanf( " %c", &grade );
。
检查 scanf
的结果以确保您在尝试处理之前确实阅读了一些内容。 scanf
将 return 成功转换和赋值的次数(如果输入与转换说明符不匹配则为 0)或 EOF
如果存在输入错误。
- 好吧,除非您找到一个将
'A'
编码为 1 的系统,否则您不会这样做,即使您这样做了,这也意味着所有剩余的测试仍然会因同样的原因而失败。
#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'
但是,正确 处理不区分大小写比较的方法是使用 toupper
或 tolower
库函数之一将所有内容转换为大写或小写:
#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 )
一次,您的代码就不会遍历整个页面。
其他随机尼特...
main
returnsint
,不是void
。你的编译器可能会也可能不会抱怨它,但你不应该使用void main()
。如果您的程序不接受任何命令行参数,请使用int main( void )
,如果需要,请使用int main( int argc, char **argv)
。写字符常量时要小心 -
'b '
与'b'
不同,可能不会按您期望的方式处理。将
%c
转换说明符与scanf
一起使用时要小心。与%s
和%d
以及%f
转换说明符不同,它不会跳过任何前导白色 space。这在进行交互式输入时尤其危险,因为它会从之前的输入中拾取尾随的换行符。为确保跳过前导白色 space,请在说明符前面的格式字符串中放置一个空白 space:scanf( " %c", &grade );
。检查
scanf
的结果以确保您在尝试处理之前确实阅读了一些内容。scanf
将 return 成功转换和赋值的次数(如果输入与转换说明符不匹配则为 0)或EOF
如果存在输入错误。
- 好吧,除非您找到一个将
'A'
编码为 1 的系统,否则您不会这样做,即使您这样做了,这也意味着所有剩余的测试仍然会因同样的原因而失败。