在C语言里,支持三种结构,分别是选择,顺序和循环结构,顺序结构简单明了,一步步的从上到下,从左到右走完全程即可。分支和循环结构就比较复杂,接下来将介绍一下这两种结构。
一,分支语句
分支语句又分为if-else语句和switch-case语句
1.if-else
if-else的基本语法为
if(表达式)
{
代码块1
}
else
{
代码块2
}
表达式的值为非零,执行代码块1,表达式的值零,执行代码块2.
或者
if(表达式1)
{
代码块1
}
else if(表达式2)
{
代码块2
}
else
{
代码块3
}
表达式1的值为非零,执行代码块1,表达式的值零,则执行表达式2,如果表达式2的值为非零,则执行代码块2,否则执行代码块3。多个判断时可以使用多次的if-else语句下面会有代码演示加深理解,也可以使用(||)或者(&&)操作符来简化代码。
先看一个简单的代码
int main()
{
int Money = 0;
scanf("%d", &Money );
if (Money > 15000)
{
printf("工资偏高");
}
return 0;
}
代码内容让我们输入一个数,判断工资的高低,这里if后面的(Money>15000)是一个表达式,表达式的值为0,则if后面的语句(即花括号内的打印语句)不执行,表达式的值为非0,则执行if后面的语句。那如果输入的数是小于等于15000,则什么都不执行,如果要执行,则可以使用else语句
代码如下
int main()
{
int Money = 0;
scanf("%d", &Money);
if (Money > 15000)
{
printf("工资偏高");
}
else
{
printf("工资不是特别高");
}
}
这时输入的数无论大于还是小于等于15000,屏幕上都会打印一条语句,具体看输入的数的大小
if-case语句支持嵌套,如下,多层嵌套也可以
int main()
{
int age = 18;
int height = 175;
if (age >= 18) //判断年龄
{
if (height >= 180) //判断身高
{
printf("被录取了"); //身高和年龄都符合才打印
}
else
{
printf("没有拿到offer");
}
}
return 0;
}
if和else语句默认只执行后面的第一句话,如果需要执行多个语句,则需要用花括号括起来。
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("未成年");
printf("不可以恋爱");
if (age > 18)
{
printf("成年了");
printf("可以谈恋爱");
}
return 0;
}
对于这个代码,如果输入的是15,第一个if会打印一句未成年,但是不可以恋爱也会打印,因为这句是不受if的限制的,而第二个if,下面的两句话都不会打印,因为它们被花括号括起来了
当有多个if时,else会和距离自己最近的而且未和else匹配的if匹配。
int main()
{
int a = 10;
int b = 5;
if(a>5)
if (b < 2)
{
printf("A");
}
else
{
printf("B");
}
return 0;
}
这个代码里的else是和第二个if匹配,打印的结果为B
2.switch-case
如果当我们需要通过输入的数字判断星期几的时候用if-else语句就会显得麻烦,
这时候用switch-case语句会更合适
int main()
{
unsigned int day= 0;
scanf("%d", &day);
if (day == 1)
{
printf("星期一");
}
else if (day == 2)
{
printf("星期二");
}
else if (day == 3)
{
printf("星期三");
}
else if (day == 4)
{
printf("星期四");
}
else if (day == 5)
{
printf("星期五");
}
return 0;
}
这样写可以实现我们的目的,但是可以看到,代码太过于繁琐,因此当出现多种情况的时候可以选择switch-case语句
首先,switch-case的语法为
switch(整形表达式)
{
case 整形常量表达式1 : 语句;
case 整形常量表达式2 : 语句;
case 整形常量表达式3 : 语句;
case 整形常量表达式4 : 语句;
default :语句;break;
}
其中case后面的整形常量表达式的值不能相同,在后面的冒号不能漏,如果整形表达式的值等于case后面整形常量表达式的值,那么就执行对应的语句。
都不是,则执行default后的语句;
将上面的代码实现后如下
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:printf("周一"); break;
case 2:printf("周二"); break;
case 3:printf("周三"); break;
case 4:printf("周四"); break;
case 5:printf("周五"); break;
case 6:printf("周六"); break;
case 7:printf("周日"); break;
default:printf("输入错误"); break;
}
return 0;
}
可以看出,代码简化了一些,但是不是很多,每一句的打印语句后都加了一个break,break的意思的跳出,打破,跳出这个switch,不执行后面的语句。如果没有break,这里用一个代码说明break的作用
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:printf("周内"); break;
case 6:
case 7:printf("周末"); break;
default:printf("输入错误"); break;
}
return 0;
}
这里当输入的是1~5时,都会打印周内,如果day的值等于case后面的常量,则会一直向下执行,知道遇到break才会跳出switch停止。分支语句就到此为止啦,接下来就介绍循环语句。
二,循环语句
在生活中很多事都是一个循环的过程,比如每一天的工作或者学习,在计算机里面该怎么实现循环呢,接下来就为大家介绍一下。
1.for循环
for循环的语法为
for(表达式1;表达式2;表达式3)
{
代码块
}
表达式1为初始化一个变量,表达式2为判断语句,判断是否要继续循环,也可以认为是终止循环的条件,表达式3作用是调整变量的大小。这三个表达式可以省略,但是不建议初学者省略,可能造成一些问题。
简单看一个代码
int main()
{
int i = 0;
for (; i < 10; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 0; i < 10; i++)
{
printf("%d ", i);
}
return 0;
}
两个循环打印的值是一样的,拿第二个循环来解释for的循环机理,i=0,先和表达式2比较,0<10,则执行循环体,打印0,在调整i的值,之后在和表达式2进行比较,如果为真,继续执行循环体,打印1,在调整,在比较,直到比较的结果为假,则终止循环。
如果想要提前结束循环也是可以的,C语言提供了一个break关键字,在switch-case语句中,是用来跳出switch语句,在循环里,它的作用是跳出循环,
还是上面的代码,进行稍加改造
int main()
{
int i = 0;
for (; i < 10;i++ )
{
if (i == 4)
{
break;
}
printf("%d ", i);
}
return 0;
}
打印结果是0 1 2 3 当i==4时,为真,执行break,跳出循环,这就是break在for循环中的作用
如果我要在屏幕上打印10以内的奇数,该怎么写代码呢
int main()
{
int i = 1;
for (; i < 10; i += 2)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i < 10; i++)
{
if (i % 2 == 0)
{
continue;
}
printf("%d ", i);
}
return 0;
}
方法一
奇数1,3,5,7,9 所以初始化变量为1,10以内,所以判断语句为i<10,相差2,所以调整语句为i+=2
方法二
打印奇数,那就是不打印偶数,使用if(i%2==0)语句来判断偶数,如果是偶数,那么就continue,continue的作用是终止本次循环,即此次循环后的代码不执行,在这个代码里,就是偶数就不打印,奇数就打印。
break和continue在for循环的作用不同,前者直接终止循环,后者终止此次循环。
关于for就介绍到这里吧,
2.while循环
while循环的语法为
while(表达式)
{
循环体
}
表达式为判断语句,表达式为真则循环,为假则不循环
int main()
{
int i = 1;
while (i < 10)
{
printf("%d ", i);
i++;
}
return 0;
}
和for循环一样,需要对循环变量初始化,否则它是随机值,也需要一个调整变量大小的表达式,如上的i++;介绍for循环时提到可以省略一些表达式,代码如下
int main()
{
int i = 0;
while (i < 10)
{
printf("%d ", i);
i++;
}
printf("\n");
i = 0;
for (; i < 10;)
{
printf("%d ", i);
i++;
}
return 0;
}
可以看到,虽然一个是for循环,一个while循环,但代码很相似,将for的两个表达式写开,就得到了一个while循环,所以这两个循环可以互相转化,for循环能实现的while循环也能。
同样,break语句和continue语句在while循环里作用也是彻底终止循环和终止此次循环
3.do-while循环
最后结束do-while循环
它的语法和前面两个不同,大致为
do{
循环体
}while(表达式);
与前面的循环不一样的是do-while循环至少做一次,而且最后的分号不能漏掉,for和while
可以一次都不循环,最后的分号不能漏掉。循环的机理大致是:执行循环体->判断表达式的值,值为真,继续循环,值为假,终止循环。这也是为什么它至少循环一次的原因,因为它是先循环一次后在判断。
看一个简单代码
int main()
{
int i = 0;
do
{
printf("%d ", i);
i++;
} while (i < 10);
return 0;
}
在do-while循环中,break语句和continue语句的作用依旧是彻底终止循环和终止此次循环。
int main()
{
int i = 0;
do
{
printf("%d ", i);
if (i == 5)
{
break;
}
i++;
} while (i < 10);
printf("\n");
i = 0;
do
{
printf("%d ", i);
if (i == 5)
{
continue;
}
i++;
} while (i < 10);
}
第一个循环,打印的值为0 1 2 3 4 5
遇到break语句后,直接终止循环
第二个循环,打印的值为0 1 2 3 4 然后死循环的打印5 5 5 5 5 5…
遇到continue语句后不执行后面的语句,即变量没有办法进行调整大小,一直都是5,所以死循环的打印5
由于do-while至少执行一次这个特性,所以实际中需要对不同情况选择不同循环。
关于分支和循环语句的介绍,就到这里啦!