首页 > 代码库 > C语言攻略指南(三)流程控制篇
C语言攻略指南(三)流程控制篇
流程控制语句,或者说控制流语句,是用于控制程序计算操作执行的次序,使我们能实现判断,选择,循环等操作。本篇将逐一描述 C语言中的流程控制语句。
选择结构
- if 语句
if(表达式) 语句1; else 语句2;
如果表达式的值为真(非0),执行语句1,如果为假(0),则执行语句2。(在 C语言中,非零即真)
这里的语句并不单指一条以 ; 为结束符的语句,也可能是多条语句,而是多条语句时,即代码块,最好用 { } 括起来,这样不容易出错,也方便读。
else 部分是可选的,如果不写,表达式的值为真执行语句1,为假不操作,执行后面的代码。
#include <stdio.h> int main () { int a, b; a = 1; b = 2; if( a > b ) printf("a 的值大 \n"); else printf("b 的值大 \n"); return 0; }
- else-if 语句
if(表达式1) 语句1; else if(表达式2) 语句2; ... else 语句n;
这是编写多路判断的常用方法,如果条件1不成立,则判条件2,如果条件2不成立,则判条件3... 当全部条件都不成立(所有表达式的值都为0),则执行语句n。
通俗来说,就是哪个从上往下,哪个表达式的值先为真,就执行哪个表达式下对应的语句。
#include <stdio.h> int main () { int select; printf("请输1~3: "); scanf("%d" ,&select); if( select > 3 || select < 1 ) { printf("输入错误!\n"); return 0; } if( select == 1 ) printf("大师兄,师傅被妖怪抓走啦! \n"); else if( select == 2 ) printf("大师兄,二师兄,师傅被妖怪抓走啦! \n"); else printf("大师兄,师傅和二师兄被妖怪抓走啦!~\\(≧▽≦)/~ \n"); return 0; }
if 语句可以嵌套使用
if(表达式) if(表达式) if(表达式) ... else else else
if 和 else 的匹配准则是: else 与距离它最近的在同一个作用域内的没有被配对的 if 进行匹配。
注意: 在使用 if 语句 要注意同级的(配对的)if 和 else 的起始位置要放在同一列,用 { } 将作用域划分清楚,不容易出错。
- switch 语句
switch(表达式){ case 常量表达式1: 语句1; [break;] case 常量表达式2: 语句2; [break;] ... case 常量表达式n: 语句n; [break;] default: 语句n+1; [break;]
[...] 代表可选
switch 语句的执行过程: 首先计算出表达式的值,如果某个case后面的常量表达式N(N取1-n)的值等于 switch 语句中表达式的值,那么就执行该case后的语句N;如果没有,执行 default后的语句n+1。
注意: 如果语句段后面有 break,则执行完语句N后退出 switch语句,否则将继续执行下去,直到遇见 break,如果没有 break,将执行到最后一条switch 语句。
#include <stdio.h> int main () { int score; printf("请输入学生的得分: "); scanf("%d" ,&score); if( score > 100 || score < 0 ) { printf("输入错误!\n"); return 0; } switch(score/10){ case 0: case 1: case 2: case 3: case 4: case 5: printf("学生成绩为:差 \n"); break; case 6: printf("学生成绩为:及格 \n"); break; case 7: printf("学生成绩为:中 \n"); break; case 8: printf("学生成绩为:良 \n"); break; default: printf("学生成绩为:优 \n"); } return 0; }
switch 语句也可以嵌套
switch(表达式1){ case 常量表达式1: switch(表达式2){ case 常量表达式2-1: 语句1; [break;] case 常量表达式2-2: 语句2; [break;] ... case 常量表达式2-n: 语句n; [break;] default: 语句n+1; [break;] } [break;] case 常量表达式2: 语句2; [break;] ... case 常量表达式n: 语句n; [break;] default: 语句n+1; [break;] }
注意: 在使用 switch 嵌套时,break 仅仅是终止当前的 switch 语句,而不是退出整个多重 switch 语句。
循环结构
- while 循环
while(表达式) { 循环体; }
首先求表达式的值,如果其值为真(非0),则执行循环体,并再次求表达式的值,按照这种模式循环下去,直到求得表达式的值为假(0)为止,之后将跳出循环,执行while循环之后的语句。
example: 逐行打印 0-9 十个数(while)
#include <stdio.h> int main () { int a = 0; while( a < 10 ) { printf("a 的值: %d\n", a); a++; } return 0; }
- do-while 循环
do{ 语句; }while(表达式);
do-while 是先执行循环体,再判断表达式的值是否为真,如果为真,继续执行循环体,否则退出循环。
do-while循环与while循环的区别: 由于do-while 是先执行再判断,故无论do-while 的表达式是什么,其循环体至少会执行一次,而while循环是至少0次。
注意: 在 while(表达式)后有一个分号,不能被省略,否则会报错。
example: 逐行打印 0-9 十个数(do-while)
#include <stdio.h> int main () { int a = 0; do{ printf("a 的值: %d\n", a); a++; }while( a < 10 ); return 0; }
- for 循环
for( 表达式1; 表达式2; 表达式3 ) 语句;
表达式1 和 表达式3 是赋值表达式或函数调用,表达式2 是关系表达式。这三个表达式均可省略,但必须保留分号。如果省略表达式2 (测试条件),则认为其值永远是真值;省略表达式1 和表达式3,它就相当于while循环语句。
example: 逐行打印 0-9 十个数(for)
#include <stdio.h> int main () { for( int a = 0; a < 10; a++ ) printf("a 的值: %d\n", a); return 0; }
#include <stdio.h> int main () { int a = 0; for( ; a < 10; ) { printf("a 的值: %d\n", a); a++; } return 0; }
break 语句与 continue语句
break 语句的作用是退出循环结构,在嵌套的 for 语句或者嵌套的 switch 语句退出的是 break 所在的循环结构。
#include <stdio.h> int main () { int i; int a[]={2,-1,4,7,-3,8}; for( i = 0; i < 6; i++ ) if( a[i] < 0 ) break; else printf("%d \n", a[i]); return 0; }
continue 语句是结束本次循环,而非真正退出循环结构。
#include <stdio.h> int main () { int i; int a[]={2,-1,4,7,-3,8}; for( i = 0; i < 6; i++ ) if( a[i] < 0 ) continue; else printf("%d \n", a[i]); return 0; }
goto 语句
goto 语句也叫无条件转移语句。注意: goto 语句只能在函数内部进行迁移,不能够跨越函数。
goto 语句标号; ... 语句标号: 或 语句标号: ... goto 语句标号;
语句标号是 goto 语句转向的目标,语句标号遵循 C语言命名规则,且后有冒号而不是分号。
#include <stdio.h> int main () { int num; int sum; num = 0; sum = 0; loop: sum += num; num++; if(num<10) goto loop; printf("sum = %d \n",sum); return 0; }
实际中尽可能少用 goto 语句,如用了,需写清楚注释。
ps: O(∩_∩)O~~
C语言攻略指南(三)流程控制篇