1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > C语言的控制结构(顺序结构 选择结构 循环结构)详解

C语言的控制结构(顺序结构 选择结构 循环结构)详解

时间:2022-10-29 23:59:29

相关推荐

C语言的控制结构(顺序结构 选择结构 循环结构)详解

C语言的三种控制结构

一、顺序结构二、选择结构2.1 if语句(只会匹配一个表达式对应内容)2.2 switch语句三、循环结构for循环while循环do while循环四、goto语句

前言:程序由三种基本结构组成:顺序结构、选择结构、和循环结构,任何程序都由这3种基本结构组合而成。

优点:不会存在无规律的转向,可以使程序结构清晰,易于验证正确性且易于纠错。遵循这种方法的程序设计就是结构化程序设计。

此处简单画出三种结构的执行流程图:

注意:C语言没有布尔类型,在C语言中用数字0表示假,非0表示真,文章后面不在进行说明

一、顺序结构

顺序结构:依照线性顺序依次执行,简单说就是从上到下依次执行

例如下面程序会依次输出1、2、3、4、5

#include <stdio.h>int main(void) {printf("1");printf("2");printf("3");printf("4");printf("5");return 0;}

输出:

12345

二、选择结构

选择结构:通过某个给定条件进行判断,条件为真或假时分别执行不同的程序内容,选择结构分if语句和switch语句两种(就像人生不是一帆风顺,直线往前走。比如今天出门看到外面下雨了就会带伞,没有下雨就不用带伞一样进行判断)

2.1 if语句(只会匹配一个表达式对应内容)

语法结构(主要分为三种,下面会一 一举例):

说明:以 ; 结尾是一条语句,

第一种

if(表达式)

执行语句;

#include <stdio.h>int main(void) {int age = 0;printf("请输入你的年龄:>");scanf("%d", &age);if (age >= 18) //当if括号内表达式为真时(即非0),才会执行紧接if的第一条语句printf("成年\n");return 0;}

输入

18

输出

成年

输入

15

输出

代码块: 一对大括号 { }包裹的语句叫做代码块

在if语句中如果不使用代码块则只会执行紧接if的第一条语句,后面语句与if表达式判断无关。如果想当if表达式为真时执行多条语句,需要将多条语句包裹在代码块内,下面将举例说明:

//程序本意是当用户输入年龄大于等于18时,输出成年并可以谈恋爱。小于18时则什么都不输出//但是if表达式后面有两条语句,但没有使用代码块包裹,则不管用户输入什么都会输出 可以谈恋爱#include <stdio.h>int main(void) {int age = 0; printf("请输入你的年龄:>");scanf("%d", &age);if (age >= 18) printf("成年\n");printf("可以谈恋爱了");return 0;}

输入

18

输出

成年可以谈恋爱了

输入

17

输出

可以谈恋爱了

使用代码块执行多条语句

//用户输入大于等于18输出成年并可以谈恋爱,小于18则什么都不输出#include <stdio.h>int main(void) {int age = 0;printf("请输入你的年龄:>");scanf("%d", &age);if (age >= 18) {printf("成年\n");printf("可以谈恋爱了");}return 0;}

输入

18

输出

成年可以谈恋爱了

输入

17

输出

第二种

if(表达式)

执行语句1;

else

执行语句2;

#include <stdio.h>int main(void) {int age = 0;printf("请输入你的年龄:>");scanf("%d", &age);if (age >= 18) //当if括号内表达式为真则执行下面第一条语句printf("成年\n");else //当上面表达式都不匹配时,则匹配else,执行else下面第一条语句printf("未成年\n");return 0;}

输入

18

输出

成年

输入

16

输出

未成年

当if或else想执行多条语句时使用代码块,后续再不演示有代码块和没有代码块的区别

//当用户输入年龄大于等于18时输出成年可以谈恋爱,否则输出未成年不可以谈恋爱#include <stdio.h>int main(void) {int age = 0;printf("请输入你的年龄:>");scanf("%d", &age);if (age >= 18){printf("成年\n");printf("可以谈恋爱\n");}else{printf("未成年\n");printf("不可以谈恋爱\n");}return 0;}

输入

18

输出

成年可以谈恋爱

输入

15

输出

未成年不可以谈恋爱

第三种(多分枝选择)

if(表达式1)

执行语句1;

else if(表达式2)

执行语句2;

else

执行语句3;

//根据用户输入年龄,输出所处年龄段#include <stdio.h>int main(void) {int age = 0;printf("请输入你的年龄:>");scanf("%d", &age);if (age <= 12) //当if表达式为真,输出童年并退出整个if语句,否则继续向下判断{printf("童年\n");}else if (age < 18) //当年龄大于12小于18此表达式为真,输出青少年,{printf("青少年\n");}else if (age < 60) //当年龄大于等于18小于60此表达式为真,输出壮年,{printf("壮年\n");}else//当上面多个表达式都不匹配时最后会匹配else对应语句,即输出老年{printf("老年\n");}return 0;}

输入

11

输出

童年

输入

50

输出

壮年

悬空else(else只会与紧挨的第一个if匹配,与代码缩进无关,这跟python语言不一样)

//首先进入if判断,由于a=0,所以不匹配 a == 1表达式,则直接退出整个if语句。//但是此写法会让人误以为由于a=0,所以不匹配 a == 1表达式,则匹配else,输出:不可以谈恋爱,但注意此处//else会与它紧紧挨着的if匹配,即if(b==2)匹配上,但是if(b==2)又是if(a==1)表达式为真的前提下才行#include <stdio.h>int main(){int a = 0;int b = 2;if (a == 1)if (b == 2)printf("可以谈恋爱\n");elseprintf("不可以谈恋爱\n");return 0;}//修改后代码#include <stdio.h>int main(){int a = 0;int b = 2;if (a == 1){if (b == 2){printf("可以谈恋爱\n");}else{printf("不可以谈恋爱\n");}}return 0;}

输出

2.2 switch语句

当分支条件过多时使用if会十分的不方便,上面例子中判断年龄段的程序,如果再判断的精细些(加上青少年、青年、中老年等),则整个if语句会十分臃肿且难以维护。使用switch就能很好解决这种问题。

语法(下面[ ]内代表可选参数):

switch(整形表达式)

{

case整数常量表达式1:

 语句1_1

 语句1_2

 [break]

 …

case整数常量表达式2:

 语句2_1

 语句2_2

 …

 [break]

[default

 语句n_1

  break]

}

说明:

当case后面常量表达式值等于switch的整数表达式时,执行该case后面的语句,但不退出switch,而是一直执行下去,直到整个switch结束,所以case只是switch的入口这跟if匹配到某个表达式执行对应语句后就退出不一样case后面的常量表达式的值不能相同,例如出现多个 case 1:在switch中遇到break会退出整个switch当switch的整数表达式与所有case都没匹配上时,则执行default对应语句

//程序本意,当用户输入1-7时输出对应星期几#include <stdio.h>int main(){int day = 0;printf("请输入今天是星期几:> ");scanf("%d", &day);switch (day) //switch()内必须是整数表达式,例如当里面是变量时,此变量必须为整数类型(short、char、int、long){case 1: //当case后面常量表达式值等于switch的整数表达式时,进入该case,并依次执行剩下内容printf("星期一\n");case 2:printf("星期二\n");case 3:printf("星期三\n");case 4:printf("星期四\n");case 5:printf("星期五\n");case 6:printf("星期六\n");case 7:printf("星期天\n");}return 0;}

输入

2

输出

星期二星期三星期四星期五星期六星期天

我们本来只是想输出星期二,结果case 2:对应语句执行完后继续执行,直到整个switch执行完。

这时我们可以加上break关键字

break在switch作用:在switch中遇到break会退出整个switch,不管break下面还有没有case语句

//当用户输入1-7时输出对应星期几#include <stdio.h>int main(){int day = 0;printf("请输入今天是星期几:> ");scanf("%d", &day);switch (day) {case 1: printf("星期一\n");break; //遇到break跳出对应switchcase 2:printf("星期二\n");break;case 3:printf("星期三\n");break;case 4:printf("星期四\n");break;case 5:printf("星期五\n");break;case 6:printf("星期六\n");break;case 7:printf("星期天\n");break;}return 0;}

输入

2

输出

星期二

但此时用户输入除了1-7以外的值,整个switch没有匹配到,程序不会输出什么,此程序对用户不够友好。我们无法预测用户输入的所有可能值,但我们可以对不符合规则的输入进行提醒,此时会用到default关键字,即case都没有匹配到,则执行default对应语句

//当用户输入1-7时输出对应星期几#include <stdio.h>int main(){int day = 0;printf("请输入今天是星期几:> ");scanf("%d", &day);switch (day){case 1:printf("星期一\n");break; //遇到break跳出对应switchcase 2:printf("星期二\n");break;case 3:printf("星期三\n");break;case 4:printf("星期四\n");break;case 5:printf("星期五\n");break;case 6:printf("星期六\n");break;case 7:printf("星期天\n");break;default:printf("输入错误,请输入1-7范围内的数字\n");break;}return 0;}

输入

8

输出

输入错误,请输入1-7范围内的数字

当想多个case执行相同语句时

//当用户输入1-5时输出工作日,输出6-7时输出休息日#include <stdio.h>int main(){int day = 0;printf("请输入今天是星期几:> ");scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:case 5:printf("工作日\n");break;case 6:case 7:printf("休息日\n");break;default:printf("输入错误,请输入1-7范围内的数字\n");break;}return 0;}

输入

3

输出

工作日

输入

5

输出

工作日

三、循环结构

循环结构:当条件为真时反复执行,直到条件为假则跳出(《围城》里面说到,有的人想进去,有的人却想出去,就像人生一样好像一直循环着)

for循环

语法:

for(表达式1;表达式2;表达式3)

循环语句;

说明:

表达式1:初始化部分,用于初始化循环变量,整个for循环只会执行1次

表达式2:条件判断部分,用于判断循环终止

表达式3:调整部分,用于循环条件的调整

建议:不要在循环体内修改循环变量,防止for循环失控

//输出数组所有元素#include <stdio.h>int main() {int arr[] = {1,2,3,4,5,6,7,8,9,10};int i;//第一次循环首先将i初始化为0,这个初始化部分只会执行1次,此时i<10(只有判断条件为真才会进入循环)//执行循环语句输出arr[0],然后进入调整部分让变量i加1,此时i=1;//第二次循环,首先进入判断部分进入判断;此时i<10 即 1<10为真,执行循环语句输出arr[1],然后进入调整部分//让变量i+1,此时i=2;后续循环跟第二次循环类似//注意:初始化部分在整个for循环只执行1次,判断部分会比循环语句多1次for (i = 0; i < 10; i++) {printf("%d ", arr[i]);}return 0;}

输出

1 2 3 4 5 6 7 8 9 10

break:循环中遇到break直接终止整个循环(while、do while中也一样)

//在1-10中输出小于5的数#include <stdio.h>int main(){int i = 0;for (i = 1; i <= 10; i++){if (i == 5) //当i == 5时,if条件为真,执行break,跳出整个for循环,所以数字5及后续数字不会打印break;printf("%d ", i);}return 0;}

输出

1 2 3 4

continue:循环中遇到continue会终止本次循环,也就是本次循环continue后面代码不会执行(while、do while中也一样)

#include <stdio.h>int main(){int i = 0;for (i = 1; i <= 10; i++){if (i == 5) //当i == 5时,if条件为真,执行continue,终止本次循环后面代码(即5不会打印)。直接跳到调整部分,i++后i为6,进行下一次循环的判断continue;printf("%d ", i);}return 0;}

输出

1 2 3 4 6 7 8 9 10

while循环

语法:

while(表达式)

循环语句

当表达式为真时执行循环语句,然后再次判断…

//输出1-10#include <stdio.h>int main(){int i = 1;while (i <= 10) //当表达式为真执行里面{ }内循环语句{printf("%d ", i); i++; //调整部分,使i变量逐渐大于10后终止循环,没有调整部分将会是死循环}return 0;}

输出

1 2 3 4 5 6 7 8 9 10

break:

//输出1-4#include <stdio.h>int main(){int i = 1;while (i <= 10) //当表达式为真执行里面{ }内循环语句{if (i == 5) //当i==5时执行break,终止整个while循环break;printf("%d ", i); i++; }return 0;}

输出

1 2 3 4

continue

#include <stdio.h>int main(){int i = 1;while (i <= 10) //当表达式为真执行里面{ }内循环语句{if (i == 5) //当i==5时执行continue,终止本地循环continue后面部分,i++不会执行,所以进入判断部分i还是5,导致死循环continue;printf("%d ", i); i++; //调整部分,使i变量逐渐大于10后终止循环,没有调整部分将会是死循环}return 0;}

输出

1 2 3 4 //死循环,后面光标一直闪烁,程序没有停止运行

do while循环

语法

do

循环语句

while(表达式)

do while与while基本相同,表达式为真才会执行循环语句。但是do while第一次执行时不会判断表达式

即就算表达式为假也会执行一次循环语句

do while 适用场景:某个功能必须执行一次,后续是否执行通过是否满足条件判断

#include <stdio.h>int main(){do{printf("哈哈哈\n");} while (0); //第一次循环时输出 哈哈哈,由于表达式为假,退出do while循环return 0;}

输出

哈哈哈

break

//输出1-4#include <stdio.h>int main(){int i = 1;do{if (i == 5)break;printf("%d ", i);i++;} while (i <= 10); return 0;}

输出

1 2 3 4

continue

#include <stdio.h>int main(){int i = 1;do{if (i == 5) //当i=5时表达式为真,执行continue,直接到判断部分,此时i<=10进入循环语句,但i=5时表达式为真,执行continue,直接到判断部分依此类推,程序陷入死循环continue;printf("%d ", i);i++;} while (i <= 10); return 0;}

输出

1 2 3 4 //死循环,后面光标一直闪烁,程序没有停止运行

四、goto语句

C语言提供了可以使用的goto语句和标记跳转的标号。理论上goto语句没有使用必要(容易代码逻辑错造成随意跳转),但在深层循环嵌套使用break达不到目的。而可以使用goto可以解决

语法

标号:

语句;

if(表达式)

goto 标号;

标号:表达需要跳转的位置

goto 标号:跳到哪个标号去

//当用户输入 博主是个大帅哥 就会输出 你也是大帅哥 退出程序,否则死循环#include <stdio.h>#include <string.h>int main(){char input[20];printf("请输入:博主是个大帅哥,否则程序死循环\n");again: //使用 again标记需要跳转位置scanf("%s", input);if (strcmp(input,"博主是个大帅哥") == 0) //strcmp() 字符串比较函数,当为0代表两个字符串相等{printf("你也是个大帅哥\n");}else{printf("你说谎,请重新输入:>");goto again; //跳转到again标号对应位置}return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。