目录
前言
C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,C语言是能够实现这三种结构的,其实我们如果仔细分析,我们日常所见的事情都可以拆分为这三种结构或者这三种结构的组合。
一.分支语句
1.if语句
语法形式:
if(表达式)
语句;
当表达式为真,则语句执行;表达式为假,则语句不执行
2.else语句
else一般与if同用,形成if....else....语句。当if不成立时,则执行else的语句
语法形式:
if(表达式)
语句;
else
语句;
3.分支中包含多条语句
在if和else语句中默认都只控制一条语句,若想控制多条语句,要使用{ }将其括住
例子:
#include <stdio.h> int main() { int flag = 0; printf("若想执行,请输入一个非零整数:"); scanf("%d", &flag); if (flag) { printf("执行成功,"); printf("输入的数是%d\n", flag); } else printf("执行失败\n"); return 0; }
输出结果:
注: 在C语言中,0表示假,非0表示真
4.嵌套if
在if else语句中,else可以与另一个if语句连用,构成多重判断
else else if(表达式)
If(表达式) ==等同于== 语句;
语句;
if语句还可以嵌套在if语句中,形成嵌套的if语句
if(表达式){
if(表达式)
语句;
}
例子:
#include <stdio.h> int main() { int flag = 0; printf("请输入一个非负整数:"); scanf("%d", &flag); if (flag>=0){ printf("符合条件,"); if (flag == 0) printf("该数为0"); else if (flag == 1) printf("该数为1"); else printf("该数大于1"); } else printf("不符合条件"); return 0; }
5.悬空else问题
在多个if和else中,else总是跟最接近的if匹配
对于这样的问题,注意排版和使用{}是关键
例子:
#include <stdio.h> int main() { int a = 0; int b = 0; if (a == 0) if (b == 1) printf("hehe\n"); else printf("haha\n"); return 0; }
在这个代码中,看起来else是和第一个if匹配的,但实际上不对,else是和第二个if匹配,形成if else语句,因此程序会先判断第一个if是否成立,成立了才会再判断if else语句.
改版(与第二个if匹配):
#include <stdio.h> int main() { int a = 0; int b = 0; if (a == 0){ if (b == 1) printf("hehe\n"); else printf("haha\n"); } return 0; }
改版2(与第一个if匹配):
int main() { int a = 0; int b = 0; if (a == 0) { if (b == 1) printf("hehe\n"); } else printf("haha\n"); return 0; }
这样运用{}再加上排版(就是是匹配的一一对齐),一眼就看出来了,清晰明了。
6.switch语句
switch(expression){ case value1: statement break; case value2: statement break; ... default: statement }
注:
- expression必须是整型表达式
- case和后边的数字(value)之间必须要有空格
- 数字(value)必须是整型常量表达式
- break的作用:在执行完switch中某个case子句的代码后,想跳出这个switch语句,就要加上一个break
- 对于break的使用,要灵活运用,才能正确完成实际的要求
- default的作用:当switch后的表达式无法与case语句的值相匹配时,执行default后的代码
- case和default没有先后位置,只不过我们习惯将default子句放到最后
例子:
#include <stdio.h> int main() { int flag = 0; scanf("%d", &flag); switch (flag) { case 0: printf("flag=%d\n", flag); case 1: printf("flag=%d\n", flag); case 2: printf("flag=%d\n", flag); default: printf("flag=%d\n", flag); } return 0; }
这里的switch语句中没有break,它会产生什么后果呢?
当我们键盘输入0时,满足case 0的条件,因此开始执行case 0后的程序,但执行完毕后,没有break,无法跳出switch语句,所以会继续执行下面的case子句,直到default子句执行完毕
我们适当填上break后
#include <stdio.h> int main() { int flag = 0; scanf("%d", &flag); switch (flag) { case 0: printf("flag=%d\n", flag); break; case 1: printf("flag=%d\n", flag); break; case 2: printf("flag=%d\n", flag); break; default: printf("flag=%d\n", flag); } return 0; }
输出结果:
就不会出现上述问题了
二、循环语句
1.while循环
while语句的语法结构和if语句十分相似
while(表达式)
语句;
例子:
#include <stdio.h> int main() { int a = 5; while (a > 0) { printf("a=%d\n", a); a--; } return 0; }
输出结果:
先进行判断a是否大于0,接着开始执行语句,再进行循环变量的调整(a--),直到a等于0时,循环结束
2.for循环
语法形式:
for(表达式1;表达式2;表达式3)
语句;
- 表达式1:循环变量的初始化
- 表达式2:循环结束条件的判断
- 表达式3:循环变量的调整
例子:
#include <stdio.h> int main() { for (int i = 5; i > 0;i--) { printf("i=%d\n", i); } printf("循环结束"); return 0; }
输出结果:
for循环开始先判断i是否大于0,接着开始执行语句,语句执行完毕后,进行循环变量的调整(i--),
然后继续判断i是否大于0....直到i等于0,退出循环
3.do-while循环
语法形式:
do
语句;
while(表达式)
例子:
#include <stdio.h> int main() { int i = 5; do { printf("i=%d\n", i); i--; } while (i > 0); printf("循环结束"); return 0; }
输出结果:
do-while循环开始执行一次语句,语句执行完毕后,进行循环变量的调整(i--),接着才判断i是否大于0,然后依次继续直到i等于0,退出循环
4.循环语句的特点
- while与for这两种循环都是先判断表达式,如果满足就进入循环,执行循环语句;如果不满足就跳出循环
- do-while循环是先直接进入循环体,执行循环语句,然后再执行while后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。因此do-while语句中循环体至少执行一次
- 在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环,这是非常常见的现象。因此C语言提供了break和continue这两个关键词
- break:永久的终止循环.只要被执行,直接跳出循环,继续往后执行
- continue:跳过本次循环中continue后的代码,直接到循环的判断部分,进行下一次循环的判断。注意当将continue放到循环调整的前面,代码可能会陷入死循环
- 循环嵌套:三种循环往往会嵌套在⼀起才能更好的解决问题
例子(以do-while为例):
break退出循环
#include <stdio.h> int main() { int i = 5; do { printf("i=%d\n", i); i--; if(i==3){ break; } } while (i > 0); printf("循环结束"); return 0; }
输出结果:
当i--后,i满足i等于3,因此执行if语句,终止循环
continue退出循环
#include <stdio.h> int main() { int i = 5; do { i--; if (i == 3) { continue; } printf("i=%d\n", i); } while (i > 0); printf("循环结束"); return 0; }
可以看到只没有输出"i=3",因为continue只跳出本次(i==3)循环
当我们将continue放到循环调整的前面时
#include <stdio.h> int main() { int i = 5; do { if (i == 3) { continue; } printf("i=%d\n", i); i--; } while (i > 0); printf("循环结束"); return 0; }
无法打印出"循环结束",因为i--在continue后面,导致i的值无法改变,一直等于3,陷入了死循环,所以要注意continue的位置
三、goto语句
C语言提供了一种特殊的语法:goto语句和跳转标号
goto语句可以实现在同一个函数内跳到设置好的跳转标号处
语法结构:
goto next;
...
next:语句;
...
例子:
#include <stdio.h> int main() { next: printf("开始打印\n"); goto next; return 0; }
输出结果:
本来只会打印一次"开始打印",但用了goto语句后,直接死循环了,所以使用goto语句要恰当,不然就会出现死循环、代码乱窜打乱程序的执行流程
总结
分支和循环语句就学完了,顺便了解了一下goto语句。最后多嘴一句,既然看到这,点个赞再走吧,亲(๑ơ ₃ ơ)♥