C语言:分支与循环
前言:
C语言是结构化的程序设计语 言,这里的结构指的是顺序结构、选择结构、循环结构,C语言是能够实现这三种结构的,其实我们如果仔细分析,我们日常所见的事情都可以拆分为这三种结构或者这三种结构的组合。
我们可以使用 if 、 switch 实现分支结构,使用 for 、 while 、 do while 实现循环结构。
声明:本文部分内容(包括图片等)来自于比特
正文开始:
1.if语句
1.1 if初识
语法形式:
if(判断语句)
{
主体
}
(大括号有时可以不加:如if后只有其需要的主体时)
若表达式为真(C语言中0为假,非0为真),则执行语句。反之不执行。
1.2 else
如果⼀个数不是奇数,那就是偶数了,如果任意⼀个整数,我们要清楚的判断是奇数还是偶数怎么表示呢?
那就要用到 if else 语句了。
if ( 表达式 )
语句1
else
语句2
默认在 if 和 else 语句中默认都只控制⼀条语句(if与else一一对应)
且if与else是最近的相对应
故大多可使用else if(判断语句)语句效果同理
2.关系操作符
< , > , >= , <= , !=(用于判断不相等), == (用于判断相等)
注意:多个关系运算符不宜连用(例子):
i < j < k
上面示例中,连续使用两个小于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,
即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执行的是下面的表达式。
1 (i < j) < k
另外:==不要写成=的赋值符号
3.条件操作符
也叫三目标操作符,有三个操作数
1.exp1?exp2:exp3
如exp1 为真,则表达结果为exp2;反之表达exp3
下为例子:
int v = (a > b ? a : b);//exp1为a > b
4.逻辑操作符:&& , || , !(<<与>>以后说)
辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
• ! :逻辑取反运算符(改变单个表达式的真假)。
• && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
• || :或运算符,就是或者的意思(两侧至少有⼀个表达式为真,则为真,否则为假)。
注:C语言中,非0表示真,0表示假
4.1 逻辑取反运算符
逻辑取反
由图可见:他在颠倒黑白!
4.2 与运算符
逻辑与
&& 就是与运算符,也是并且的意思, && 是⼀个双目操作符,使用的方式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。
4.3 或运算符
逻辑或
|| 就是或运算符,也就是或者的意思, || 也是⼀个双目操作符,使用的方式是 a || b ,
|| 两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
5.switch语句
除了 if 语句外,C语言还提供了 switch 语句来实现分支结构。
switch 语句是⼀种特殊形式的if…else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。
上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,就执行 default 分⽀。
注:
• switch 后的 expression 必须是整型表达式
• case 后的值,必须是整形常量表达式
5.1 if语句和switch语句的对比
例子:
输⼊任意⼀个整数值,计算除3之后的余数
如果使用if语句完成,如下:
#include <stdio.h>
int main()
{
int n = 0;
scanf(“%d”, &n);
if(n%3 == 0)
printf(“整除,余数为0\n”);
else if(n%3 == 1)
printf(“余数是1\n”);
else
printf(“余数是2\n”);
return 0;
}
如果使用switch语句改写,就可以是这样的:
#include <stdio.h>
int main()
{
int n = 0;
scanf(“%d”, &n);
switch(n%3)
{
case 0:
printf(“整除,余数为0\n”);
break;
case 1:
printf(“余数是1\n”);
break;
case 2:
printf(“余数是2\n”);
break;
}
return 0;
}
上述的代码中,我们要注意的点有:
- case 和后边的数字之间必须有空格
- 每⼀个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个switch语句。
5.2 switch语句中的break
switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语
句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏,有可能执⾏其他 case
语句中的代码,直到遇到 break 语句或者 switch 语句结束。
所以在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。
当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。
5.3 switch语句中的default
在使用 switch 语句的时候,我们经常可能遇到⼀种情况,比如 switch 后的表达式中的值无法匹
配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊default 子句。
switch (expression) {
case value1: statement
case value2: statement
default: statement
}
switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执行
default 子句。
5.4 switch语句中的case和default的顺序问题
在 switch 语句中 case 子句和 default 子句有要求顺序吗? default 只能放在最后吗?
其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。
不过我们通常是把 default 子句放在最后处理的。
6. while循环
C语⾔提供了3种循环语句, while 就是其中⼀种,接下来就介绍⼀下 while 语句。
while 语句的语法结构和 if 语句非常相似。
6.1 while语句的执行流程
while(执行条件)
{
执行语句
}
首先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语
句,语句执行完后再继续判断,是否进行下⼀次判断。
7. for循环
for 循环是三种循环中使⽤用最多的, for 循环的语法形式如下:
for(表达式1; 表达式2; 表达式3)
语句;//如果循环体想包含更多的语句,可以加上⼤括号
表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
7.1 for循环的执行流程
首先执行 表达式1 初始化循环变量,接下来就是执行表达式2 的判断部分, 表达式2 的结果如果==0,则循环结束; 表达式2 的结果如果!=0则执行循环语句,循环语句执行完后,再去执行表 达式3 ,调整循环变量,然后再去 表达式2 的地方执行判断, 表达式2 的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。
7.2 while循环和for循环的对比
for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部
分非常集中,便于代码的维护,而如果代码较多的时候 while 循环的三个部分就比较分散,所以从形式上 for 循环要更优⼀些。
8. do while循环
此循环基本类似while循环,但与whie不同的是会先执行一次循环体在查看主函数
此为循环基本:
do
{
循环内容
}
while(条件)
9.break和continue语句
在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环,这是非常常见的现象。C语言中提供了 break 和 continue 两个关键字,就是应该到循环中的。
• break 的作用是用于永久的终止循环,只要 break 被执行,直接就会跳出循环,继续往后执行。
• continue 的作用是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所差异的。
10.goto语句
使用条件:在一个函数内部
使用效果:跳转(现在同⼀个函数内跳转到设置好的标号处。)
{
printf(“hehe\n”);
goto next:
printf(“haha\n”);
next:
printf(“跳过了haha的打印\n”);
return 0;
}
但,goto一旦使用过多则可能造成函数不知道跳到哪去了,所以尽量少用。