2.1 C 程序结构
-
C 程序结构图示:
-
C 程序的执行部分是由语句组成的,程序的功能也是由执行语句实现的
-
语句可分为以下五类:
-
表达式语句:表达式+分号“;”组成
-
一般格式:
表达式;
-
-
函数调用语句:由函数名、实际参数加上分号“;”组成
-
一般格式:
函数名(实际参数表);
-
示例:
printf("C Program")
-
-
控制语句:
-
用于控制程序的流程, 以实现程序的各种结构方式
-
九种控制语句
控制语句类型 内容 条件判断语句 if 语句、switch 语句 循环执行语句 do while 语句、while 语句、for 语句 转向语句 break 语句、goto 语句、continue 语句、return 语句
-
-
复合语句:把多个语句用括号{}括起来组成的一个语句
{ x=y+z; a=b+c; printf(“%d%d”,x,a); }
复合语句内的各条语句都必须以分号“;”结尾,在括号“}”外不能加分号
在程序中应把复合语句看成是单条语句,而不是多条语句
-
空语句:只有分号“;”组成的语句
-
空语句是什么也不执行的语句。在程序中空语句可用来作空循环体
-
示例:
while(getchar() !='\n') ;
只要从键盘输入的字符不是回车则重新输入
-
-
2.2 分支结构
2.2.1 关系运算符和表达式
-
关系运算符,就是前面介绍的运算符的一类,如下
运算符 名称 优先级 < 小于 高 <= 小于等于 高 > 大于 高 >= 大于等于 高 == 等于 低 != 不等于 低 - 都是双目运算符,其结合性均为左结合
- 优先级:低于算术运算符,高于赋值运算符
- 在六个关系运算符中,<,<=,>,>= 的优先级相同,高于 == 和 !=;== 和 != 的优先级相同
-
关系表达式
-
一般形式为:
表达式 关系运算符 表达式
-
示例:
a+b>c-d; x>3/2; 'a'+1<c; -i-5*j==k+1; a>(b>c); //表达式也可以是关系表达式,因此也允许出现嵌套的情况 a!=(c==d);
-
关系表达式的值为:“真”和“假”,用"1"和"0"表示
-
2.2.2 if 分支语句
-
if 语句:根据给定的条件进行判断,以决定执行某个分支程序段
-
三种形式:
-
基本形式:
if(表达式) 语句
-
if-else 形式:
if(表达式) 语句 1; else 语句 2;
语义:如果表达式的值为真,则执行语句 1,否则执行语句 2
-
if-else-if 形式:
if(表达式 1) 语句 1; else if(表达式 2) 语句 2; else if(表达式 3) 语句 3; …; else if(表达式 m) 语句 m; else 语句 n;
语义:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个 if 语句之外继续执行程序。 如果所有的表达式均为假,则执行语句 n。然后继续执行后续程序。
-
-
注意:
-
三种形式的 if 语句中,在 if 关键字之后均为表达式。 该表达式通常是逻辑表达式或关系表达式, 也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量
-
三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必 须把这一组语句用 {} 括起来组成一个复合语句。要注意的是在 } 之后不能再加分号
if(a>b) {a++; b++;} else {a=0; b=10;}
-
-
if 语句嵌套
-
一般形式表示:
if(表达式) if 语句;
或者
if(表达式) if 语句; else if 语句;
-
if-else 类型嵌套:
if(表达式 1) if(表达式 2) 语句 1; else 语句 2;
- 这个 else 与那个 if 配对呢?
- C语言规定,else 总是与它前面最近的 if 配对
- 这个 else 与那个 if 配对呢?
-
在一般情况下较少使用 if 语句的嵌套结构。以使程序更便于阅读理解
-
-
条件运算符
-
如果只执行单个的赋值语句时, 可使用条件表达式来实现。不但使程序简洁,也提高 了运行效率。
-
一般形式:
表达式 1 ? 表达式 2 : 表达式 3
如果表达式 1 的值为真,则以表达式 2 的值作为条件表达式的值,否则以表达式 3 的值作为整个条件表达式的值
-
示例:
if(a>b) max=a; else max=b;
可修改为:
max=a>b?a:b;
-
注意:
-
条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符
-
条件运算符 ? 和 : 是一对运算符,不能分开单独使用
-
条件运算符的结合方向是自右至左
a>b?a:c>d?c:d
理解为:a>b?a:(c>d?c:d)
-
-
2.2.3 switch 语句
-
一般表示:
switch(表达式){ case 常量表达式 1: 语句 1; case 常量表达式 2: 语句 2; … case 常量表达式 n: 语句 n; default : 语句 n+1; }
语义:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有 case 后的语句。如表达式的值与所有 case 后的常量表达式均不相同时,则执行 default 后面的语句
-
switch 语句中,“case 常量表达式”只相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个 switch 语句,所以会出现了继续执行所有后面 case 语句的情况
- 为了避免上述情况, C语言提供了一种 break 语句,专用于跳出 switch 语句
-
注意:
- case 后的各常量表达式的值不能相同,否则会出现错误
- case 后,允许有多个语句,可以不用{}括起来
- 各 case 和 default 子句的先后顺序可以变动,而不会影响程序执行结果
- default 子句可以省略不用
-
示例:
#include<stdio.h> int main(){ float a,b; char c; printf("input expression: a+(-,*,/)b \n"); scanf("%f%c%f",&a,&c,&b); switch(c){ case '+': printf("%f\n",a+b);break; case '-': printf("%f\n",a-b);break; case '*': printf("%f\n",a*b);break; case '/': printf("%f\n",a/b);break; default: printf("input error\n"); } }
2.3 循环结构
-
C语言提供了多种循环语句,可以组成各种不同形式的循环结构
- goto 语句和 if 语句构成循环
- while 语句
- do-while 语句
- for 语句
-
goto 语句及其构成的循环
-
goto 语句是一种无条件转移语句
-
使用格式:
goto 语句标号;
标号:是一个有效的标识符,这个标识符加上一个“:”一起出现在函数内某处, 执行 goto 语句后,程序将跳转到该标号处并执行其后的语句
- 标号必须与 goto 语句同处于一个函数中,可以不在一个循环层中
-
与 if 语句构成循环示例:
#include <stdio.h> int main(){ int i,sum=0; i=1; loop: if(i<=100){ sum=sum+i; i++; goto loop;} printf("%d\n",sum);}
-
通常不用 goto 语句,,容易使程序层次不清、不易读,但在多层嵌套退出时, 用 goto 语句则比较合理
-
-
while 语句
-
一般形式:
while(循环条件表达式) 循环体语句
-
示例:
#include <stdio.h> int main(){ int i,sum=0; i=1; while(i<=100){ sum=sum+i; i++; } printf("%d\n",sum);}
-
-
do...while 语句
-
一般形式:
do 循环体语句 while(循环表达式);
do-while 循环至少要执行一次循环语句
-
-
for 语句
-
一般形式:
for(表达式 1;表达式 2;表达式 3;) 语句
- 执行过程:
- 先求解表达式 1
- 求解表达式 2,若其值为真(非 0),则执行 for 语句中指定的内嵌语句,然后执行下面第 3 步;若其值为假(0),则结束循环,转到第 5 步
- 求解表达式 3
- 转回上面第 2 步继续执行
- 循环结束,执行 for 语句下面的一个语句
- 执行过程:
-
for 语句最简单的应用形式:
for(循环变量赋初值;循环条件;循环变量增量) 语句
-
示例:
for(i=0;i<=100;i++) sum=sum+i;
-
注意:
-
for 循环中的“表达式 1(循环变量赋初值)”、“表达式 2(循环条件)”和“表达式 3(循环变量增量)”都是选择项可以缺省,但“;”不能缺省
-
省略了“表达式 1(循环变量赋初值)”,表示不对循环控制变量赋初值
-
省略了“表达式 2(循环条件)”,则不做其它处理时便成为死循环
-
省略了“表达式 3(循环变量增量)”,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句
-
3 个表达式都可以省略
for(;;;) //相当于 while(1)
-
表达式 1 可以是设置循环变量的初值的赋值表达式,也可以是其他表达式
-
表达式 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;
-
表达式 2 一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体
-
-
-
循环嵌套示例:
#include <stdio.h> int main(){ int i, j, k; printf("i j k\n"); for (i=0; i<2; i++) for(j=0; j<2; j++) for(k=0; k<2; k++) printf("%d %d %d\n", i, j, k); }
-
几种循环比较
- 处理问题:四种循环都可以用来处理同一个问题,一般可以互相代替。一般不提倡用 goto 型循环
- 功能:while 和 do-while 循环,循环体中应包括使循环趋于结束的语句。for 语句功能最强
- 初始化:使用 while 和 do-while 循环时,循环变量初始化的操作应在 while 和 do-while 语句之前完成,而 for 语句可以在表达式 1 中实现循环变量的初始化
2.4 break 和 continue
- break 语句:
- 通常用在循环语句和开关语句中
- 用于开关语句 switch 中时,可使程序跳出 switch 而执行 switch 以后的语句,如果没有 break 语句,则将成为一个死循环而无法退出
- 用于 do-while、for、while 循环语句中时,可使程序终止循环而执行循环后面的语句, 通常 break 语句总是与 if 语句联在一起,满足条件时便跳出循环
- 注意:
- break 语句对 if-else 的条件语句不起作用
- 在多层循环中, 一个 break 语句只向外跳一层
- 通常用在循环语句和开关语句中
- continue 语句:跳过循环本中剩余的语句而强行执行下一次循环
- 只用在 for、 while、do-while 等循环体中,常与 if 条件语句一起使用,用来加速循环