流程控制
流程控制主要分为顺序结构、选择结构、循环结构。任何一段C程序都能由上面三种结构组合构成。
顺序结构:
顺序结构是C语言编程中最常见的结构,几乎任何程序都是从开始到结束按照顺序依次从上到下执行。
选择结构(分支结构):
在编写代码过程中,常常根据不同的情况采取不同的数据处理过程,这时需要用上选择结构,那么程序是怎么完成选择的呢?我们都知道C语言是通过if else或者switch来完成选择控制,接着我们来详细了解一下。
if语句
了解if语句前,我们应该先了解一下关系运算和逻辑运算。
关系预算的运算符主要为 > < > = <= == !=
这些运算符都为双目运算符,需要注意的是,这些运算符在结合运算数后形成表达式,形式如a > b,这个表达式跟数学上简单的比大小概念不一样,这个表达式是有值的,并且为int类型, 这个表达式的值表示的是a > b这种关系是否成立,如果a大于b,则这种关系是成立的,表达式为1,反之为0。说到此处,C语言中没有布尔类型,靠0和1来表示真假,对于任意一个变量或常量,都是从数值的角度判断其是真是假,数值不为0则表示真,数值为0则表示假。
逻辑运算有‘与’、‘或’、‘非’,运算符为&&、||、! 。在高中数学我们学过,对于与运算,只要有一个值为假,则整个表达式为假;对于或运算,只要有一个值为真,则整个表达式为真;对于非运算,运算数为真,则整个表达式为假,运算数为假,则整个表达式为真。需要注意的是,!运算符优先级最高,&&运算符其次,||最低;对于与运算和或运算,都是从左往右算起,都有截断特性,&&运算时,如果第一个表达式为假,则整体的值为假,这个时候,程序不会执行计算&&运算符右边的表达式,这就叫截断效应,||运算时只要第一个值为真,截断效应也会使||右边的表达式不被计算。
关系运算和逻辑运算给if语句创造了判断的条件,以下是if语句的详细内容:
形式一 单分支
if(表达式)
{
语句
}
- 功能:处理单个情况。
- 语义:如果表达式成立,则按顺序执行{}内的语句,如果表达式不成立,则if直接结束,执行代码中的下一条。
- 语法细节:在if(表达式)后不要接分号,需细心编写代码。
形式二 双分支
if(表达式)
{
语句1
}
else
{
语句2
}
- 功能:处理二选一的情况。
- 语义:如果表示成立,则执行语句1后结束if语句,若表达式不成立,则执行语句2结束if语句。
- 语法细节:第一点同上,第二点,else后不写表达式,当然也不要写分号。
形式三 多分支
if(表达式1)
{
语句1
}
else if(表达式2)
{
语句2
}
...
else
{
语句n
}
- 功能:处理多种情况
- 语义:如果表达式1成立,则执行语句1,后程序结束,如果表达式2成立,则执行语句2然后程序结束。
- 注意1:这个if语句最终只能在其中的一条语句中选择执行,在考虑判断的条件时,应该是同一件事的不同情况,不是不同事的不同情况,需要考虑清除。
对于双分支结构,c语言提供了一种关系运算符,可以简写部分程序,但在使用时,应该考虑到代码的可读性,不要写的太过复杂难懂。如下所示,表示获取a和b中的最大值。
int a,b;
scanf("%d%d",&a,&b)
int max = a > b ? a : b;
switch语句
- switch语句结构如下:
switch(表达式)
{
case(常量表达式1):
语句1
break;
case(常量表达式2):
语句2
break;
case(常量表达式3):
语句3
break;
default:
语句4
break;
}
- 语义:表达式的值去匹配case后面的常量表达式,匹配到后将执行后面的语句。
- switch语句结束条件:只有执行过程中遇到break或者执行到程序最后在会结束整个switch语句。
- 注意:switch后面的表达式的结果必须是一个整型的数据;case后面只能接常量或者常量表达式;case和default是一个只在switch中起作用的标签,标签写错不会报错,只是匹配不到对应的情况;default不一定写到最后,但写在前面时break不能缺省,防止其继续执行后面的语句,因为表达式与case只匹配一次,匹配成功执行语句不退出则依次往下执行。
循环结构
循环作为编程中比较使用比较广泛的操作,C语言主要提供了以下操作以完成循环:
goto while do--while for
1.循环体(反复被执行的核心代码) |
2.结束条件 |
3.使循环趋于结束的操作 |
4.循环的初始条件 |
goto
其中goto并不是真正的循环语句,只是通过转向操作可以实现循环的效果。以以下代码讲解goto如何完成循环
int i = 0;
int sum = 0;
loop:
sum = sum + i;
i++;
if(i <= 100)
{
goto loop;
}
loop是一个标签,这段代码通过goto的转到功能在i还小于等于100时,总是会回到sum = sum + i;这句代码依次往下执行由此构成循环,得到1加到100的总和。
while
while的形式如下
while(表达式)
{
语句
}
语义:当表达式成立时,执行语句,接着再次判断表达式是否成立,成立继续重复原先的过程,知道表达式不成立,while语句结束,如果一开始表达式就不成立,while语句直接结束。
注意:while表达式后不接分号,若果有,表达式成立时,它只是执行空语句,且无法完成使循环趋于结束的操作,使程序一直空转。如果也完成1到100求和,while操作可以这么写
int i = 0;
int sum = 0;
while(i <= 100)
{
sum = sum + i;
i++;
}