选择结构
介绍以下内容:
关键字: if、 else、 switch、 continue、 break、 case、 default、 goto
运算符: &&、 ||、 ?:
函数: getchar()、 putchar()、 ctype.h系列
如何使用if和if else语句, 如何嵌套它们
在更复杂的测试表达式中用逻辑运算符组合关系表达式
C的条件运算符
switch语句
break、 continue和goto语句
使用C的字符I/O函数: getchar()和putchar()
ctype.h头文件提供的字符分析函数系列
单纯if语句
if students’grade is greater than or equai to 60
print ‘’ pass’’
if (grade >= 60)
{
puts("passed");//永远不要忘记加分号
}//end if
if else语句
如果学生成绩60以上则输出“passed”
60分以下则 fialed
if(grade >= 60)
{
printf("passed");
}
else {printf("failed");}//end else
如果是仅有单个语句,可以不加花括号
if(grade >= 60)
printf("passed");
else
printf("failed");
逻辑运算符
?: 三目运算
|| 或
&& 并
&&的优先级比||高
printf("grade >= 60?passed:failed");
printf(grade >= 60?"passed":"failed");//right
grade >= 60 ? puts("passed"): puts("failed");//equal
介绍putchar与getchar
ch = getchar();
//equal to
scanf("%c",ch);
//注意ch的数据类型是字符
事实上,较小的整型也可用字符型表示。
getchar和putchar都只能对单个字符输入和输出
优势:因为它只对字符起作用,因此较于printf等函数,不需要转换说明,更快更简洁
if的嵌套
if(grade >= 90)
puts("A");
else if(grade>=80)
puts("B");
else if(grade>=70)
puts("C");
else puts("D");
虽然说单个语句可以不加花括号,但是最好还是要严谨。
多重选择switch
示例
switch (ch)
{
case 'a':
printf("argali, a wild sheep of Asia\n");
break;
case 'b':
printf("babirusa, a wild pig of Malay\n");
break;
case 'c':
printf("coati, racoonlike mammal\n");
break;
case 'd':
printf("desman, aquatic, molelike critter\n");
break;
case 'e':
printf("echidna, the spiny anteater\n");
break;
case 'f':
printf("fisher, brownish marten\n");
break;
default:
printf("that's a stumper \n");
}
要对紧跟在关键字 switch 后圆括号中的表达式求值。该表达式是刚输入给 ch的值。 然后程序扫描标签(这里指, case ‘a’ : case ‘b’ :等) 列表, 直到发现一个匹配的值为止。 然后程序跳转至那一行。
如果没有匹配的标签怎么办? 如果有default :标签行, 就跳转至该行; 否
则, 程序继续执行在switch后面的语句
break 语句
break使之跳出switch,它让程序离开switch语句, 跳至switch语
句后面的下一条语句 。 如果没有break语句, 就会从匹配标签开
始执行到switch末尾。
switch在圆括号中的测试表达式的值应该是一个整数值(包括char类
型) 。 case标签必须是整数类型(包括char类型) 的常量或整型常量表达式
(即, 表达式中只包含整型常量) 。 不能用变量作为case标签。 switch的构
造如下:
switch ( 整型表达式)
{ case 常量1:
语句 <--可选
case 常量2:
语句 <--可选
default : <--可选
语句 <--可选
}
switch的多重标签
switch(ch = getchar())
{ case'a';
case 'A':
printf("this is A or a");
break;
case'b';
case'B':
printf("this is B or b");
break;
}//意思就是一个语句可以有多个标签
因为case‘a’后面没有break
switch 与if else
何时使用switch? 何时使用if else? 你经常会别无选择。 如果是根据浮
点类型的变量或表达式来选择, 就无法使用 switch。 如果根据变量在某范围
内决定程序流的去向, 使用 switch 就很麻烦, 这种情况用if就很方便:
if (integer < 1000 && integer > 2)
使用switch要涵盖以上范围, 需要为每个整数(3~999) 设置case标
签。 但是, 如果使用switch, 程序通常运行快一些, 生成的代码少一些
常出现的错误
if (a < x < z) // 错误, 没有使用逻辑运算符
if(ch != ‘q’ && != ‘Q’) // 错误, 缺少完整的测试表达式
以上是参考c primer plus做的学习总结
来看看不加花括号会出现什么问题
悬挂else问题
编译器通常将else与上一个if关联,除非用花括号来指定关联关系
来确定x= 9 ,y = 1和x = 11,y=9时,下列程序的输出
if(x < 10)
if(y > 10)
puts("****");
else
puts("####");
puts("$$$$");
if(x > 10)
{ if (y > 10)
puts("****");
}
else
{ puts("####");
puts("$$$$");
}