概述
目录
一、选择(判断)结构
1.if...else...
2.switch case语句
3.条件运算符
二、循环结构
1.while循环
2.for循环
3.break和continue
三、选择结构循环结构总结
1.选择结构
2.循环结构
C语言中有三大结构,分别是顺序结构、选择结构(判断)和循环结构(分支结构):
- C语言顺序结构就是让程序按照从头到尾的顺序依次执行每一条C语言代码,不重复执行任何代码,也不跳过任何代码。
- C语言选择结构也称分支结构,就是让程序有选择性的执行代码;换句话说,可以跳过没用的代码,只执行有用的代码。
- C语言循环结构就是让程序“杀个回马枪”,不断地重复执行同一段代码。
前面我们看到的代码都是顺序执行的,也就是先执行第一条语句,然后是第二条、第三条……一直到最后一条语句,这称为顺序结构。但是对于很多情况,顺序结构的代码是远远不够的,还需要选择结构与循环结构。由于顺序结构相对简单,所以本篇我们将重点学习选择结构与循环结构。
一、选择(判断)结构
1.if...else...
C 语言提供了以下类型的判断语句:
语句 | 描述 |
---|---|
if 语句 | 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 |
if...else语句 | 一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。 |
嵌套 if 语句 | 一个 if 或 else if 语句内使用另一个 if 或 else if 语句。 |
switch 语句 | 一个 switch 语句允许测试一个变量等于多个值时的情况。 |
嵌套 switch 语句 | 一个 switch 语句内使用另一个 switch 语句。 |
//多个if...else...
#include <stdio.h>
int main()
{
char c;
printf("请输入一个字符:");
c = getchar();
if (c < 32)
printf("这是一个控制字符n");
else if (c >= '0' && c <= '9')
printf("这是一个数字n");
else if (c >= 'A' && c <= 'Z')
printf("这是一个大写字母n");
else if (c >= 'a' && c <= 'z')
printf("这是一个小写字母n");
else
printf("这是一个其他字符n");
return 0;
}
//运行结果:
请输入一个字符:d
这是一个小写字母
//if语句嵌套
#include <stdio.h>
int main()
{
int a, b;
printf("请输入两个数字:");
scanf("%d %d",&a,&b);
if (a != b){
if (a > b)
printf("a>bn");
else
printf("a<bn");
}
else
{
printf("a=bn");
}
return 0;
}
//运行结果:
请输入两个数字:12 13
a<b
总结:a、语句块就是由{ }
包围的一个或多个语句的集合。如果语句块中只有一个语句,也可以省略{ }。
b、一旦遇到能够成立的判断条件,则不再执行其他的语句块,最终只能有一个语句块被执行
c、在 if 语句中,判断条件必须用括号括起来。接下来的语句块由{ }
包围,但要注意的是在}
之后不需要再加分号;
(当然加上也没错)。
d、if 语句嵌套时,要注意 if 和 else 的配对问题。C语言规定,else 总是与它前面最近的 if 配对。
e、关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<、<=、>、>=的优先级相同,高于==和!=,==和!=的优先级相同。赋值运算符(=) < &&和|| < 关系运算符 < 算术运算符 < 非(!)
f、if 语句的判断条件中不是必须要包含关系运算符,它可以是赋值表达式,甚至也可以是一个变量,例如:if(b){//TODO:};if(b=3){//TODO:}都是允许的。这里根据变量 b 的最终值来判断的,如果 b 的值为非0,那么条件成立,否则不成立。
2.switch case语句
C语言虽然没有限制if...else...能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况。对于这种情况,实际开发中一般使用 switch 语句代替,基本格式如下:
switch(表达式){
case 整型数值1: 语句 1;
case 整型数值2: 语句 2;
......
case 整型数值n: 语句 n;
default: 语句 n+1;
}
它的执行过程是:
1) 首先计算“表达式”的值,假设为 m。
2) 从第一个 case 开始,比较“整型数值1”和 m,如果它们相等,就执行冒号后面的所有语句,也就是从“语句1”一直执行到“语句n+1”,而不管后面的 case 是否匹配成功。
3) 如果“整型数值1”和 m 不相等,就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case……一旦发现和某个整型数值相等了,就会执行后面所有的语句。假设 m 和“整型数值5”相等,那么就会从“语句5”一直执行到“语句n+1”。
4) 如果直到最后一个“整型数值n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。
需要重点强调的是,当和某个整型数值匹配成功后,会执行该分支以及后面所有分支的语句!!!但实际中我们希望只执行某个分支,而跳过后面的其他分支。为了达到这个目标,必须要在每个分支最后添加break;语句。
//switch case语句
#include <stdio.h>
int main()
{
int a;
printf("请输入一个整数:");
scanf("%d",&a);
switch (a){
case 1:printf("星期一n"); break;
case 2:printf("星期二n"); break;
case 3:printf("星期三n"); break;
case 4:printf("星期四n"); break;
case 5:printf("星期五n"); break;
case 6:printf("星期六n"); break;
case 7:printf("星期日n"); break;
default:printf("errorsn"); break;
}
return 0;
}
//运行结果:
请输入一个整数:5
星期五
总结:a、break 是C语言中的一个关键字,专门用于跳出 switch 语句。所谓“跳出”,是指一旦遇到 break,就不再执行 switch 中的任何语句,包括当前分支中的语句和其他分支中的语句;也就是说,整个 switch 执行结束了,接着会执行整个 switch 后面的代码。
b、 case 后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量,也不能为小数。
c、default 不是必须的。当没有 default 时,如果所有 case 都匹配失败,那么就什么都不执行。
3.条件运算符
C语言中条件运算符语法格式为:
表达式1?表达式2:表达式3
条件运算符是C语言中唯一的一个三目运算符,其求值规则为:如果表达式1的值为真,则以表达式2 的值作为整个条件表达式的值,否则以表达式3的值作为整个条件表达式的值。条件表达式通常用于赋值语句之中。
#include <stdio.h>
int main()
{
int a, b, max;
printf("请输入两个整数:");
scanf("%d %d",&a,&b);
/*if (a > b) {
max = a;
}
else{
max = b;
}
printf("max=%dn",max);*/
printf("max=%dn",a>b?a:b);//与注释部分等价
return 0;
}
//运行结果
请输入两个整数:23 45
max=45
使用条件表达式时,还应注意以下几点:
1) 条件运算符的优先级低于关系运算符和算术运算符,但高于赋值符。
2) 条件运算符?和:是一对运算符,不能分开单独使用。
3) 条件运算符的结合方向是自右至左。例如:a>b ? a : c>d ? c : d;应理解为:a>b ? a : ( c>d ? c : d );
二、循环结构
1.while循环
while循环
while循环的一般形式为:
while(表达式){
语句块
}
先计算“表达式”的值,当值为真(非0)时, 执行“语句块”;执行完“语句块”,再次计算表达式的值,如果为真,继续执行“语句块”……这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行 while 后面的代码。
我们通常将“表达式”称为循环条件,把“语句块”称为循环体,整个循环的过程就是不停判断循环条件、并执行循环体代码的过程。
//1~100之和
#include <stdio.h>
int main()
{
int i = 1, sum = 0;
while (i <= 100){
sum += i;
i++;
}
printf("1+2+3+...+99+100=%dn",sum);
return 0;
}
//运行结果:1+2+3+...+99+100=5050
代码分析:
1) 程序运行到 while 时,因为 i=1,i<=100 成立,所以会执行循环体;执行结束后 i 的值变为 2,sum 的值变为 1。
2) 接下来会继续判断 i<=100是否成立,因为此时 i=2,i<=100 成立,所以继续执行循环体;执行结束后 i 的值变为 3,sum 的值变为3。
3) 重复执行步骤 2)。
4) 当循环进行到第100次,i 的值变为 101,sum 的值变为5050;因为此时 i<=100 不再成立,所以就退出循环,不再执行循环体,转而执行while循环后面的代码。
while 循环的整体思路是这样的:设置一个带有变量的循环条件,也即一个带有变量的表达式;在循环体中额外添加一条语句,让它能够改变循环条件中变量的值。这样,随着循环的不断执行,循环条件中变量的值也会不断变化,终有一个时刻,循环条件不再成立,整个循环就结束了。
如果循环条件中不包含变量,分为两种情况:1) 循环条件永远为真,while 循环会一直执行下去,永不结束,成为“死循环”。2)循环条件永远为假,while 循环一次也不会执行。
do-while循环
除了while循环,在C语言中还有一种 do-while 循环,do-while循环的一般形式为:
do{
语句块
}while(表达式);//注意最后的分号;,这个必须要有。
//do-while计算1~100之和
#include <stdio.h>
int main()
{
int i = 1, sum = 0;
do{
sum += i;
i++;
} while (i <= 100);//注意最后的分号;,这个必须要有。
printf("1+2+3+...+99+100=%dn",sum);
return 0;
}
//运行结果:1+2+3+...+99+100=5050
do-while循环与while循环的不同在于:它会先执行“语句块”,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while 循环至少要执行一次“语句块”。
2.for循环
for 循环的一般形式为:
for(表达式1; 表达式2; 表达式3){
语句块
}
它的运行过程为:
1) 先执行“表达式1”。
2) 再执行“表达式2”,如果它的值为真(非0),则执行循环体,否则结束循环。
3) 执行完循环体后再执行“表达式3”。
4) 重复执行步骤 2) 和 3),直到“表达式2”的值为假,就结束循环。
上面的步骤中,2) 和 3) 是一次循环,会重复执行,for 语句的主要作用就是不断执行步骤 2) 和 3)。
“表达式1”仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。“表达式2”一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”。“表达式3”很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得“不成立”。由此我们可以总结出for循环的一般形式:
for(初始化语句; 循环条件; 自增或自减){
语句块
}
//for循环计算1~100之和
#include <stdio.h>
int main()
{
int i , sum = 0;
for (i = 1; i <= 100; i++){
sum += i;
}
printf("1+2+3+...+99+100=%dn",sum);
return 0;
}
//运行结果:1+2+3+...+99+100=5050
代码分析:
1) 执行到 for 语句时,先给 i 赋初值1,判断 i<=100 是否成立;因为此时 i=1,i<=100 成立,所以执行循环体。循环体执行结束后(sum的值为1),再计算 i++。
2) 第二次循环时,i 的值为2,i<=100 成立,继续执行循环体。循环体执行结束后(sum的值为3),再计算 i++。
3) 重复执行步骤 2),直到第101次循环,此时 i 的值为101,i<=100 不成立,所以结束循环。
for 循环中的“表达式1(初始化条件)”、“表达式2(循环条件)”和“表达式3(自增或自减)”都是可选项,都可以省略(但分号;
必须保留)。
1) 修改“从1加到100的和”的代码,省略“表达式1(初始化条件)”:,可以看到,将i=1
移到了 for 循环的外面。
int i = 1, sum = 0;
for (; i <= 100; i++){
sum += i;
}
2) 省略了“表达式2(循环条件)”,如果不做其它处理就会成为死循环:,循环条件永远成立,循环会一直进行下去,永不结束。死循环对程序的危害很大,一定要避免!!!
int i, sum = 0;
for (i=1; ; i++){
sum += i;
}
等价于
i=1;
while(1){
sum=sum+i;
i++;
}
3) 省略了“表达式3(自增或自减)”,就不会修改“表达式2(循环条件)”中的变量,这时可在循环体中加入修改变量的语句:
for (i=1; i <= 100; ){
sum += i;
i++;
}
4) 省略了“表达式1(初始化语句)”和“表达式3(自增或自减)”:
int i=1, sum = 0;
for (; i <= 100; ){
sum += i;
i++;
}
等价于
while(i<=100){
sum=sum+i;
i++;
}
5) 3个表达式可以同时省略:
for( ; ; ) 语句 <=> while(1) 语句
6) “表达式1”可以是初始化语句,也可以是其他语句:
int i=1, sum ;
for (sum = 0; i <= 100; i++){
sum += i;
}
7) “表达式1”和“表达式3”可以是一个简单表达式也可以是逗号表达式:
for( sum=0,i=1; i<=100; i++ ) sum=sum+i;
或
for( i=0,j=100; i<=100; i++,j-- ) k=i+j;
8) “表达式2”一般是关系表达式或逻辑表达式,但也可是数值或字符,只要其值非零,就执行循环体:
for( i=0; (c=getchar())!='n'; i+=c );
又如:
for( ; (c=getchar())!='n' ; )
printf("%c",c);
3.break和continue
使用while或for循环时,如果想提前结束循环(在不满足结束条件的情况下结束循环),可以使用break或continue关键字。
当 break 关键字用于 while、for循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。在多层循环中,一个 break 语句只向外跳一层。
//输出m*n的整数矩阵
#include <stdio.h>
int main()
{
int i = 1, j;
while (1){
j = 1;
while (1){
printf("%d*%d=%-4d",i,j,i*j);
j++;
if (j > 9) break;
}
printf("n");
i++;
if (i > 5) break;
}
return 0;
}
//运行结果
1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9
2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
//解析:当 j>9 成立时,执行break;,跳出内层循环;外层循环依然执行,直到 i>5 成立,跳出外层循环。内层循环共执行了9次,外层循环共执行了5次。
continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。
#include <stdio.h>
int main()
{
char c = 0;
while (c != 'n'){ //回车键结束循环
c = getchar();
if (c == '4' || c == '5'){ //按下的是数字键4或5
continue; //跳过当次循环,进入下次循环
}
putchar(c);
}
return 0;
}
//运行结果:
123456789
1236789
//解析:本例我们输入的是123456789,当读取到4或5时,if 的条件c=='4'||c=='5'成立,就执行 continue 语句,结束当前循环,直接进入下一次循环,也就是说putchar(c);不会被执行到。而读取到其他数字时,if 的条件不成立,continue 语句不会被执行到,putchar(c);就会输出读取到的字符。
总结:break与continue的对比:break 用来结束所有循环,循环语句不再有执行的机会;continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。
三、选择结构循环结构总结
1.选择结构
1.选择结构(分支结构)涉及到的关键字包括 if、else、switch、case、break,还有一个条件运算符表达式1?表达式2:表达式3
(这是C语言中唯一的一个三目运算符)。其中,if...else 是最基本的结构,switch...case 和表达式1?表达式2:表达式3
都是由 if...else 演化而来,它们都是为了让程序员书写更加方便。
2.可以只使用 if,也可以 if...else(if...else if...else if...) 配对使用。另外要善于使用 switch...case 和? :
,有时候它们看起来更加清爽。
3.if...else 可以嵌套使用,原则上嵌套的层次(深度)没有限制,但是过多的嵌套层次会让代码结构混乱。
2.循环结构
C语言中常用的循环结构有while 循环和 for 循环,它们都可以用来处理同一个问题,一般可以互相代替。
1.对于 while 和 do-while 循环,循环体中应包括使循环趋于结束的语句。对于 while 和 do-while 循环,循环变量的初始化操作应该在 while 和 do-while 语句之前完成,而 for 循环可以在内部实现循环变量的初始化。
2.for 循环是最常用的循环,它的功能强大,一般都可以代替其他循环。
3.要注意 break 和 continue 关键字用于循环结构时的区别:
①break 用来跳出所有循环,循环语句不再有执行的机会;
②continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。
此外,break 关键字还可以用于跳出 switch...case 语句。所谓“跳出”,是指一旦遇到 break,就不再执行 switch 中的任何语句,包括当前分支中的语句和其他分支中的语句;也就是说,整个 switch 执行结束了,接着会执行整个 switch 后面的代码。
参考文献:C语言中文网
最后
以上就是合适芒果为你收集整理的选择和循环结构的全部内容,希望文章能够帮你解决选择和循环结构所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复