C语言是结构化的程序设计语言,支持顺序、选择、循环三种结构。顺序结构就是程序从开始到结束,下面来介绍一下用于实现分支和循环的语句。
分支语句
一:if语句
1:语法形式
if(表达式)
语句1;
else
语句2;
2:用法:
先判断括号中的表达式,若成立(为真)则执行语句1,否则(为假)执行语句2。在C语言中0表示假,非零值表示真,表达式成立则表达式的值为真。 默认情况下if和else的后面只能跟一条语句,如果要写多条语句就要在{ }里面进行。在写代码的时候也可以不写else语句,此外if语句中也可以嵌套if语句实现多重选择。如果有多个if和else,else总是跟其最接近的if进行匹配。
二:switch语句
1:语法形式
switch (表达式)
{
case 整型常量表达式1: 语句1;
case 整型常量表达式2: 语句2;
.......
case 整型常量表达式n: 语句n;
default: 语句n+1;
}
2:用法
根据括号中表达式的不同值,执行与其相对应的case分支(表达式的值与case后面表达式的值相同则执行),若找不到则执行default分支。case后的语句可以有多个且不用{ },default和case没有顺序要求,但通常将default放在最后,default分支也可不写。switch后面的表达式必须是整型表达式,case后面的值必须是整型常量表达式(字符类型是归类到整型类型中的,因为字符的本质ASCII码值是整数)。switch语句不会在执行了相对应的语句后跳出来,而是继续执行该语句后面的语句。要跳出switch语句则要在每一个case语句的后面加上一条break语句。
循环语句
一:while循环
1:语法形式
while (表达式)
语句;
2:用法
判断表达式的值,若表达式为真则语句执行。while循环要写多条语句也要在{ }中进行。
二:for循环
1:语法形式
for (表达式1; 表达式2; 表达式3)
语句;
2:用法
表达式1用于循环变量的初始化(只执行一次)、表达式2用于循环结束条件的判断、表达式3用于循环变量的调整。执行流程为先执行表达式1,然后判断表达式2,若为真则执行语句,之后执行表达式3,然后再判断表达式2,若满足条件则继续执行语句,否则跳出循环。for循环要想执行多条语句也要放在{ }里面。
三:do - while循环
1:语法形式
do
语句;
while (表达式);
2:用法
先直接进入循环体执行循环语句,若想写多条语句也要加{ },然后再判断表达式,表达式的值为真则继续执行循环体,表达式为假则不在执行。
需要注意的是do - while循环的最后面要加一个分号;
四:循环的嵌套
while循环、do - while循环、for循环这三种循环之间可以嵌套使用,这样能更好的解决问题。
break和continue语句
一:break语句
break的作用是永久的终止循环,在循环语句中想要循环在某中条件下终止就可以使用break语句来完成。
二:continue语句
continue的作用是跳过本次循环中continue后面的代码,继续进行下一次循环。
goto语句
C语言提供了一种非常特殊的语言,就是goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的标号处。如:
#include <stdio.h>
int main()
{
printf("aaa\n");
goto next;
printf("bbb\n");
next:
printf("ccc\n");
return 0;
}
该代码执行到goto语句时会跳到设置好的标号next处,从而执行next之后的代码,即会跳过代码printf("bbb\n");
goto语句使用不当会打乱程序的执行流程,但是在多层循环的代码中想快速跳出用goto语句就很方便了。
表达式的判断问题
到这里我们知道分支语句和循环语句的执行都要先判断表达式的值,只有表达式为真才能执行语句。所以这里介绍两种操作符。
关系操作符
C语言中用于比较的表达式称为关系表达式,而关系表达式中使用的运算符(操作符也叫运算符)就是关系运算符。主要有以下6种:
> 大于运算符
>= 大于等于运算符
< 小于运算符
<= 小于等于运算符
== 相等运算符(一个等号是赋值操作符)
!= 不相等运算符
C语言中0表示假、非零值表示真。而关系表达式通常返回0或1来表示真假。关系运算符是从左到右进行计算的。
逻辑操作符
逻辑操作符主要有&&,||,!三种,提供逻辑判断功能(注:逻辑运算符的结果为真用1来表示)。
&& 与运算符,相当于并且,是一个双目操作符(即有两个操作数的操作符)。用法:a && b,&&两边的表达式都为真则为真,否则为假。
|| 或运算符,相当于或者,也是一个双目操作符。用法:a || b,||两边的表达式只要有一个是真则整个表达式就是真。
! 逻辑取反运算符,是一个单目操作符。用法:改变单个表达式的真假。
短路:
C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右侧的表达式求值。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值,这种情况就是短路。
下面来看这样一个代码:
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf(" i = %d \n a = %d\n b = %d\n c = %d\n d = %d\n", i, a, b, c, d);
return 0;
}
代码分析:a等于0,a++就等于1,但a++为前置++,其使用的规则是先使用、后++,即a++的值是0,所以a++ && ++b这个表达式整体的值是0,所以右侧的表达式++b不执行,然后整个表达式就变成了0 && d++,因为左侧为0,所以整个表达式的也是0,而且右侧表达式d++也不会执行,最后整个表达式的值就是0,赋给变量i之后i的值就是0。
运行结果:
同理可以分析一下逻辑运算符||
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ || ++b || d++;
printf(" i = %d \n a = %d\n b = %d\n c = %d\n d = %d\n", i, a, b, c, d);
return 0;
}
和前面一样a++的值是0,然后a自增1,因为是或运算符,还要看右侧的表达式++b的值,而该表达式是后置++,其使用规则是先++,后使用,即++b的值就等于b的值,所以表达式a++ || ++b整体的值是1,为真了,则整个表达式就变成了1 || d++,因为该表达式整体已经确定为真了,就是1,所以右侧的表达式d++就不执行了,变量d的值还是4,最后将整个表达式的值赋值给变量i之后i的值就是1。
运行结果: