目录
4..4 switch 语句中的 case 和 default 顺序问题
8.1 while 循环中的 break 和 continue
8.3 do while循环中的 break 和 continue
C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构。
我们可以使用 if、switch语句实现分支结构。使用for、while、do while实现循环结构
1.if语句
1.1 if
if语句的语法形式如下:
if (表达式)
语句 ; //如果分支语句中,想包含更多语句,可以加上大括号
在C语言中,0为假,非零为真。表达式成立,为真,即表达式结果为0,则执行语句;表达式不成立,为假,即表达式结果不是0,则不执行语句。
1.2 else语句
上面的代码我们只能打印偶数,如果是奇数就不会有动作,这里就需要用到 if……else……语句,语法形式如下:
if (表达式)
语句1
else
语句2
这样就可以对一个数进行奇偶判断了。
1.3 分支中包换多条语句
默认if和else语句中默认都只控制一条语句,如果想要 同时控制多条语句,那么就需要在if语句和else语句跟上大括号 {} 示例如下:
1.4 嵌套if
在 if else语句中,else可以与另一个if语句连用,构成多重判断。
方便可以直接使用 else if(表达式) 来代替,示例如下:
1.5 else就近匹配if
请判断上面这个给程序运行的结果是什么呢?
一些初学者会认为这个代码输出结果是222.但运行了之后会发现什么也不会输出。
如果有多个语句,else 语句会和接近的 if 语句进行匹配。
带上适当的大括号会使代码逻辑更加清晰。下面的代码运行才是一些初学者认为的结果。
2.关系操作符
C语言用于比较的表达式,被称为“关系表达式”,里面使用的运算符就被称为“关系运算符”。
主要的关系运算符有下面6个:
- > 大于运算符
- >= 大于等于运算符
- < 小于运算符
- <= 小于等于运算符
- == 相等运算符
- != 不相等运算符
关系表达式通常返回 0 表示假;返回 1 表示真
注意:相等运算符 == 与赋值运算符 = 是两个不一样的运算符,不要混淆。有时候在表达式中把 == 写成 = 也能运行,但会出现意料之外的结果。所以写关系式时,可以先写数字,将变量放在后面。示例如下:
if (3 == X)
另一个需要注意的是:多个关系运算符不宜连用。示例如下:
a > b > c; //写出来的 想表达的
(a > b ) > c; //程序以为的
程序会先将 a 和 b 进行比较,输入 0(表示假) 或者 1(表示真),然后再将输出的数字和 c 进行对比。想要表达两个关系式都满足,可以使用下面的这种形式
a < b && b < c //这样才能满足两个表达式
3.逻辑操作符:&&、||、!
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符:
- && 与运算符,表示并且的意思(两侧的表达式都为真,则为真;一个为假,则为假)
- || 或运算符,就是或者得意思(两侧的表达式有一个为真,则为真;两个都为假,则为假)
- ! 逻辑饭运算符(改变单个表达式得真假)
3.1 与运算符
&& 就是与运算符,也是双目操作符,是并且的意思。&&两边的表达式都为真,则为真;一个为假,则为假。
3.2 或运算符
||就是或运算符,也是双目操作符,是或者的意思。||两边的表达式有一个为真,则为真;两个都为假,则为假
3.3 逻辑反运算符
假设有一个 flag 的变量,如果、flag为真,那 !flag 就为假。如果 !flag 是表达式,那么就是flag为假的时候执行后面的代码。
3.4 判断润年练习
判断闰年的规则:1.能被4整除并且不能被100整除是闰年 2.能被400整除也是闰年
if 中的表达式, year % 4 == 0 && year % 100 != 0 意思是年份能被4整除,但不能被100整除,&&式并且的意思;year % 400 == 0 意思是年份能被400整除,|| 是或者的意思。
3.5 短路
C语言逻辑运算符还有一个特点:先对左侧的表示求值,再对右边的表达式求值。如果左侧的表达式满足逻辑运算符的条件,就不再对右侧的表达式求值,这种情况称为”短路“。
例如,&&是并且的意思,左边的表达式为假,整个表达式都为假,就不再对右侧求值;||是或者的意思,左侧的表达式为真,即整个表达式为真,也不对右侧求值。这种运算称为“短路求值”。
4.switch语句
除了 if 语句,C语言还提供了 switch 语句来实现分支结构,用于判断条件多个结果的情况,表达式语法如下:
switch (表达式)
{
case 值1:
语句
case 值2:
语句
default:
语句
}
根据表达式不同的值,执行相应的case分支,如果找不到对应的值,就执行default分支。
注意:1..switch语句后的表达式必须是整型表达式
2.case后的值,必须是整型常量表达式,不能是 a、b这样的变量
4.1 if 语句和 switch 语句的对比
练习:输出任意一个整数值,计算除3之后的余数。
使用 if 分支语句如下:
int main()
{
int a = 0;
printf("请输入一个整数:");
scanf("%d",&a);
if (a % 3 == 0)
printf("余数是0\n");
else if(a%3==1)
printf("余数是1\n");
else if (a % 3 == 2)
printf("余数是2\n");
return 0;
}
使用 switch 分支语句如下:
int main()
{
int a = 0;
printf("请输入一个整数:");
scanf("%d",&a);
switch (a % 3)
{
case 0:
printf("余数是0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
注意:1. case和后边的数字之间必须有空格
2. 每一个case语句中所有的代码执行完成后,需要加上 break ,才能跳出switch语句。
4.2 switch语句中的break
在之前的代码中,如果我们去掉了break会的到什么样的结果呢?
我们发现,当执行完表达式结果相对应的 case语句之后,会继续执行后面的语句,直到语句结束。所以合理使用 break 语句才能实现真正的分支效果。
当然,break语句也不一定每一个case语句都要有,这得根据实际情况来判断。当输入1-5时,显示工作日;输入6、7时,显示休息日。示例如下:
4.3 switch 语句中的 default 语句
在使用 switch 语句时,有时会遇到表达式的值无法与 case 语句进行匹配,这时就没有动作,使用 default 语句可以解决这个问题。以之前的代码为例:
4..4 switch 语句中的 case 和 default 顺序问题
在 switch 语句中,case 和 default 语句是没有顺序要求的,只是通常将 default 语句放在最后方面理解。
5 while 循环
5.1 if 和 while 的对比
while 语句的语法结果和 if 语句非常相似
if (表达式)
语句; //如果分支语句中,想包含更多语句,可以加上大括号
while (表达式)
语句; //如果循环想包含更多语句,可以加上大括号
在C语言中非零为真,0为假。假设 if 和 while 的表达式都为非零时,能够满足表达式,if 中的语句会执行一次语句,而 while 则会一直执行语句,直到不满足表达式或者遇到 break 为止。
5.2 实践while循环
练习:打印1-10
语句分析:赋予变量 a 一个初始值 1,执行 while 语句时,满足 <=10 的表达式,开始循环打印 a 和 a自增 1,直到不满足表达式 >10 之后停止。
6.for循环
6.1 语法形式
for 循环是三种循环中使用的最多的,for 循环的语法形式如下:
for ( 表达式1 ; 表达式2 ; 表达式3 )
表达式1:用于循环变量的初始化
表达上2:用于循环结束条件的判断
表达式3:用于循环变量的调整
注意:三个表达式之间使用英文分号(;)隔开
for 循环先使用表达式1的初始值在表达式2中进行判断,符合继续执行的条件之后,执行循环语句,执行结束后进行变量的调整,然后在表达式2中进行判断,继续执行循环语句...
整个循环过程中,只有表达式1执行一次,表达式2、循环语句、表达式3都在循环中。
6.2 实践 for 循环
练习:打印1-10
语句分析:在 for 的表达式1中赋予 a 一个初始值 1,再放到表达式2中进行判断,满足条件,执行循环语句,执行完循环语句之后,在表达式3中进行自增1,再放到表达式2中进行判断,直到 a>10 为止
6.3 for 循环和 while 循环的对比
两者在实现循环过程中,都有初始化、判断、变量调整这三个部分。但是 for 循环中的这三个部分更加集中,方便代码维护。当循环语句过长之后,while 循环不方便查找这三个部分。
7 do while 循环
7.1 语法形式
在循环语句中 do while 语句使用的最少,它的语法如下:
do
语句; //如果循环语句中,想包含更多语句,可以加上大括号
while (表达式)
while 和 for 这两种循环,都是先判断,如果条件满足就进入循环,如果不满足就跳出循环。
而 do while 循环则是先进入循环,执行循环语句,然后再执行 while 后的判断表达式,表达式为真,则进行下一次;表达式为假;则不再继续循环。
7.2 实践do while 循环
练习:打印1-10
语句分析:赋予 a 一个初始值 1,先放到进行 do 语句后面的打印整形和自增1,再放到 while 后面的判断表达式中进行判断,满足条件,继续执行下一次循环。知道 a>10 不满足表达式之后跳出循环。
8. break 和 continue 语句
在循环执行的过程中,遇到一些情况时,需要提前终止循环。这就需要使用到 break 语句和 continue 语句。
break 的作用是永久的终止循环,只要 break 被执行,就会直接跳出循环。
continue 的作用是跳过本次循环,即跳过 continue 后面的代码。
8.1 while 循环中的 break 和 continue
8.1.1 break
当 a 满足了 if 语句中的条件后,执行 break 语句,直接跳出循环,只打印了1 2 3 4 。
8.1.2 continue
当把上面的 break 换成了 continue 之后,也打印出了 1 2 3 4,但是还有光标在闪烁,程序并没有执行完。这是因为当 a 满足 if 语句的条件之后,执行 continue 语句,跳过本次循环,并没执行到后面的自增1的操作,于是 a 一直满足 if 的条件。死循环跳过本次循环。
8.2 for 循环中的 break 和 continue
8.2.1 break
for 循环中的 break 和 while 循环中的 break 执行得到的结果一样,都是直接终止了循环。
8.2.2 continue
当把上面的 break 换成了 continue 之后,打印出了1-10之间除了5的数。当 a 满足 if 的条件时,跳过本次循环,回到表达式2中进行判断,满足条件之后,到表达式3中进行自增1,继续进行后面的循环。
8.3 do while循环中的 break 和 continue
8.3.1 break
do while 语句中的 break 和 continue 语句的作用与while循环中的作用几乎一模一样。
10 goto语句
C语言提供了一种特别的语法,就是 goto 语句和跳转标号,实现在同一个函数内跳转到设置好的标号处。
如果goto语句使用不当,就会导致在函数内随意乱跳,打乱程序的执行流程。
goto 语句在多层循环的代码中,在最内层中使用 goto 语句,将调准标号设置到最外层,能够很方便得跳出多重循环。