导图社区 第04课控制语句
C语言中的控制语句,循环语句,循环辅助语句:goto 语句通常不建议使用,因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。但是当函数有很多个出口,使用 goto 把这些出口集中到一处来处理是很方便的,特别是函数中有许多重复的清理工作的时候。
编辑于2022-04-10 22:28:03第04课 控制语句
C语言概述
分支语句
if()~ else~ switch()~case~
循环语句
for()~ while()~ do~while() goto
辅助控制语句
return break continue
小技巧
vi 命令行模式下输入 gg=G 可以自动调整代码格式
:vsp filename.c 同时打开另一个 .c 文件
pow(x, y)表示x的y次方,需引入头文件 #include<math.h>
课时一 控制语句 if
if 语句的形式
if 最简单的形式
if (表达式) {语句}
if…else 的形式
if…else if…else 的形式
表达式:一般情况下为逻辑表达式或关系表达式 一种是数值是否为零;另一种是表达式是否成立。
例如:if(a= =b && x= =y) printf(“a=b,x=y”);
也可以是任意类型(包括整型、实型、字符型、指针类型) 例如:if(‘a’) printf(“%d”,’a’);
在C语言中,if 只能控制其后的一个语句,如果要控制多个语句就必须加大括号{ } else 也只能控制到其后的一个语句,如果要控制多个语句的话必须要加大括号{ }
if 可以没有 else 单独使用,但如果要用 else,它必须是 if 的一部分,else 绝对不可以脱离if而单独使用
注意区分 if (x=1) 与 if (x= =1) 的不同
代码规范化: if 与它后面的括号之间要加一个空格 if、else、for、while、do 后面的执行语句不论有多少行,就算只有一行也要加{ },这是规范问题。
课时二 控制语句 switch
switch语句的一般形式
不带break的形式: switch (表达式) { case 常量表达式1: 语句1; case 常量表达式2: 语句2; ┇ case 常量表达式n: 语句n; default: 语句n+1; }
带break的形式: switch (表达式) { case 常量表达式1: 语句1; break; case 常量表达式2: 语句2; break; ┇ case 常量表达式n: 语句n; break; default: 语句n+1; }
switch语句的说明
switch 中的表达式可以是整型、字符型表达式或枚举(本质上都是整型)。 也就是说可以是 int 型变量、char 型变量,也可以直接是整数或字符常量,哪怕是负数都可以。但绝对不可以是实数,float 型变量、double 型变量、小数常量通通不行,全部都是语法错误。
case 后面的常量表达式必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量。
default 不是必须的。当没有 default 时,如果所有 case 都匹配失败,那么就什么都不执行。
break 用于跳出 switch 语句。所谓“跳出”,是指一旦遇到 break,就不再执行 switch 中的任何语句,包括当前分支中的语句和其他分支中的语句;也就是说,整个 switch 执行结束了,接着会执行整个 switch 后面的代码。
“case 常量表达式n”只是起语句标号的作用,并不是在该处进行判断。
在执行 switch 语句时,根据 switch 后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断,即不管后面的case是否匹配成功(除非遇到break)。 需要重点强调的是,当switch后的表达式中的值和某个整型数值匹配成功后,会执行该分支以及后面所有分支的语句(除非遇到break跳出switch语句)。
switch 语句体通常是一个从 case 标签开始的语句块。如果在第一个 case 标签之前有语句,这些语句并不会被执行。
C 语言的标签(即语句标号)只用于标识程序流可能跳转到的目的地。这些标签本身对程序没有影响。因此,从 switch 跳转到第一个符合条件的 case 标签之后,程序会继续顺序执行,不受其他标签的影响,即不管后面的case是否匹配成功。 如果在这个符合条件的 case 标签之后,其他 case 标签中的语句应该被忽略,就应该在所执行的最后一条语句后,加上 break 语句,使得程序流直接跳转到 switch 语句体的外面。
课时三 循环语句 while
while 循环
while循环的一般形式: while (表达式){ 语句块; }
通常将“表达式”称为循环条件,把“语句块”称为循环体 整个循环的过程就是不停判断循环条件、并执行循环体代码的过程
所有的 for 循环都可以转化成 while 循环,不仅如此,所有的 while 循环也都可以转化成 for 循环 for循环和while循环可以相互转换
do-while 循环
do-while循环的一般形式: do{ 语句块; }while (表达式) ;
do-while循环与while循环的不同在于: 它会先执行“语句块”,然后再判断表达式是否为真。 如果为真则继续循环;如果为假,则终止循环。 因此,do-while 循环至少要执行一次“语句块”
goto 语句
C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句
goto语句的一般形式: goto label; .. . label: statement;
label 可以是任何除 C 关键字以外的纯文本,它可以设置在 C 程序中 goto 语句的前面或者后面。 执行 goto 语句后,程序将跳转到该 label 处并执行其后的语句 label 必须与 goto 语句同处于一个函数中,但可以不在一个循环层中。通常 goto 语句与 if 条件语句连用,当满足某一条件时,程序跳到 label 处运行,

goto 语句通常不建议使用,因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。 但是当函数有很多个出口,使用 goto 把这些出口集中到一处来处理是很方便的,特别是函数中有许多重复的清理工作的时候。 理由: 1、无条件跳转易于理解 2、可以减少嵌套 3、可以避免那种忘记更新某一个出口点的问题 4、算是帮助编译器做了代码优化
课时四 循环语句 for
for 循环的一般形式: for(表达式1; 表达式2; 表达式3){ 语句块; } “表达式1”仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。 “表达式2”一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”。 “表达式3”很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得“不成立”。
for 循环中的三个表达式
for 循环中的“表达式1(初始化语句)”、“表达式2(循环条件)”和“表达式3(自增或自减)”都是可选项,都可以省略(但分号;必须保留)。 3个表达式同时省略,例如 for( ; ; ) 语句块;等同于 while(1) 语句块;
“表达式2”一般是关系表达式或逻辑表达式,但也可以是数值或字符,只要其值非零,就执行循环体。 例如: for( ; (c=getchar())!='\n' ; ) printf("%c",c);
课时五 循环辅助语句
return语句
return语句的一般形式为:return (表达式); 有没有( )都是正确的,为了简明,一般也不写( )
函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回 关于“函数的定义”以及“函数的调用”参见下述C语言中的函数
return只能用在函数中,用来返回处理结果, 即return只会出现在函数中
在函数中,如果碰到return 语句,那么程序就会返回调用该函数的下一条语句执行,也就是说跳出函数的执行,回到原来的地方继续执行下去。 但是如果是在 main() 函数中碰到return语句,那么整个程序就会停止,退出程序的执行。
这里的“函数”主要有两种
一种是用在main() 函数中,即退出整个函数 (如果return用在main() 函数中的while或者for等语句中也等于是在main() 函数中)
另一种是用在用户自定义的函数中,即退出该函数返回其被调用的地方继续执行后面的代码
return很强大,如果一个函数中有一个return,并且执行了,那么这个函数就结束了
return表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值,由return后面的参数指定
在返回类型是char的函数中,return后应该是char类型的值;
在返回类型是int的函数中,如果是要停止函数的调用,最好应该为0;
在返回类型是结构类型的函数中,return后应该是结构的一个实例对象;
如果实在不需要函数返回什么值,就需要用void声明其类型,此时可以不需要return语句或者直接return,后面不跟任何数据,表示什么也不返回,仅仅用来结束函数。
 prime() 的返回值是 void,return 后面不能带任何数据, 直接写分号即可,此时return仅仅用来结束函数。
return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。 如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况(可以通过定义一个变量来接收函数的return值)。
return语句可以有多个,可以出现在函数体的任意位置,但是每次调用函数只能有一个 return 语句被执行,所以只有一个返回值(少数的编程语言支持多个返回值,例如Go语言)。
函数一旦遇到 return 语句就立即返回,后面的所有语句都不会被执行到了。 从这个角度看,return 语句还有强制结束函数执行的作用。 return 语句是提前结束函数的唯一办法
break语句
使用while或for循环时,如果想提前结束循环(在不满足结束条件的情况下结束循环),可以使用break或continue关键字。
当 break 关键字用于 while、for 循环时,会终止循环而执行整个循环语句后面的代码,忽略循环体中任何其他语句和循环条件测试。 break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。 break还可用来跳出switch语句
在多层循环中,一个 break 语句只向外跳一层。 如果循环是嵌套循环,那么需要按照嵌套的层次,逐步使用break来跳出。
break与continue的对比
break 用来结束所有循环,循环语句不再有执行的机会;
continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。
continue语句
continue 关键字的作用是跳过循环体中剩余的语句而强制进入下一次循环,也就是说,他并不跳出循环,而是继续往下判断循环条件,执行语句。 他只能结束循环中的一次过程,但不能终止循环继续进行。 continue 只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。
C语言中的函数
函数是一段可以重复使用的代码,用来独立地完成某个功能,它可以接收用户传递的数据,也可以不接收
return是C语言中的一个关键字,只能用在函数中,用来返回处理结果,即return只会出现在函数中
C语言中不允许函数嵌套定义;也就是说,不能在一个函数中定义另外一个函数,必须在所有函数之外定义另外一个函数。(函数必须先定义后使用) main() 也是一个函数定义,也不能在 main() 函数内部定义新函数。
重点:main() 是函数定义,不是函数调用。当可执行文件加载到内存后,系统从 main() 函数开始执行,也就是说,系统会调用我们定义的 main() 函数。 除了main() 外,用户还可自定义函数:将代码段封装成函数的过程叫做函数定义