C语言的控制结构(顺序结构、选择结构、循环结构)详解 您所在的位置:网站首页 ns流程图选择结构 C语言的控制结构(顺序结构、选择结构、循环结构)详解

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

2024-07-09 09:06| 来源: 网络整理| 查看: 265

C语言的三种控制结构 一、顺序结构二、选择结构2.1 if语句(只会匹配一个表达式对应内容)2.2 switch语句 三、循环结构for循环while循环do while循环 四、goto语句 前言:程序由三种基本结构组成: 顺序结构、选择结构、和循环结构,任何程序都由这3种基本结构组合而成。 优点:不会存在无规律的转向,可以使程序结构清晰,易于验证正确性且易于纠错。遵循这种方法的程序设计就是结构化程序设计。

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

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

一、顺序结构

顺序结构:依照线性顺序依次执行,简单说就是从上到下依次执行 例如下面程序会依次输出1、2、3、4、5

#include int main(void) { printf("1"); printf("2"); printf("3"); printf("4"); printf("5"); return 0; }

输出:

12345 二、选择结构

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

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

语法结构(主要分为三种,下面会一 一举例): 说明:以 ; 结尾是一条语句, 第一种 if(表达式)   执行语句;

#include 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 int main(void) { int age = 0; printf("请输入你的年龄:>"); scanf("%d", &age); if (age >= 18) printf("成年\n"); printf("可以谈恋爱了"); return 0; }

输入

18

输出

成年 可以谈恋爱了

输入

17

输出

可以谈恋爱了

使用代码块执行多条语句

//用户输入大于等于18输出成年并可以谈恋爱,小于18则什么都不输出 #include 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 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 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 int main(void) { int age = 0; printf("请输入你的年龄:>"); scanf("%d", &age); if (age printf("青少年\n"); } else if (age 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 int main() { int a = 0; int b = 2; if (a == 1) if (b == 2) printf("可以谈恋爱\n"); else printf("不可以谈恋爱\n"); return 0; } //修改后代码 #include 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 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 int main() { int day = 0; printf("请输入今天是星期几:> "); scanf("%d", &day); switch (day) { case 1: printf("星期一\n"); break; //遇到break跳出对应switch case 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 int main() { int day = 0; printf("请输入今天是星期几:> "); scanf("%d", &day); switch (day) { case 1: printf("星期一\n"); break; //遇到break跳出对应switch case 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 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 int main() { int arr[] = {1,2,3,4,5,6,7,8,9,10}; int i; //第一次循环首先将i初始化为0,这个初始化部分只会执行1次,此时i int i = 0; for (i = 1; i int i = 0; for (i = 1; i int i = 1; while (i int i = 1; while (i int i = 1; while (i do { printf("哈哈哈\n"); } while (0); //第一次循环时输出 哈哈哈,由于表达式为假,退出do while循环 return 0; }

输出

哈哈哈

break

//输出1-4 #include int main() { int i = 1; do { if (i == 5) break; printf("%d ", i); i++; } while (i if (i == 5) //当i=5时表达式为真,执行continue,直接到判断部分,此时i printf("你也是个大帅哥\n"); } else { printf("你说谎,请重新输入:>"); goto again; //跳转到again标号对应位置 } return 0; }

goto使用注意事项

goto不能跨函数,指定的标签必须位于当前函数中,所有标签为内部命名空间的成员,因此不会干扰其他标识符。goto跳转到标签位置的范围内不能有任何变量的初始化,除非该变量作用域不与标签作用域相同。 例1 void test1() { printf("-test1-"); goto label3; // 错误,goto不能跨越函数 label1: printf("-label1-"); label2: printf("-label2-"); } void test2() { printf("-test2-"); label3: printf("-label3-"); label4: printf("-label4-"); } 例2 void test1() { printf("-test1-"); goto label2; label1: printf("-label1-"); label2: printf("-label2-"); } void test2() { printf("-test2-"); label2: printf("-test2() label2-"); label3: printf("-label3-"); label4: printf("-label4-"); } /* test1函数中label2标签与test2函数中label2标签不冲突,因为标签为内部命名空间的成员,作用域只在当前函数 */ 例3 void test1() { printf("-test1-"); goto label2; int i; // 正确 label1: printf("-label1-"); int j = 2; // 错误,不允许对变量初始化 label2: printf("-label2-"); } void test1() { printf("-test1-"); goto label2; int i; // 正确 label1: printf("-label1-"); { int j = 2; // 正确,通过大括号将变量j作用域与标签相隔离 } label2: printf("-label2-"); }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有