目录
前言
C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,C语言是能够实
现这三种结构的,其实我们如果仔细分析,我们日常所见的事情都可以拆分为这三种结构或者这三种
结构的组合。
我们可以使用 if
、 switch
实现分支结构,使⽤ for
、 while
、 do while
实现循环结构。
分支与循环的语句可以分为以下三类:
- 条件判断语句(也叫分支语句):if语句、switch语句;
- 循环执行语句:do while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句。
一、分支结构
(一)、if语句
1. if语句和else语句
if
语句的语法形式如下:
if ( 表达式 )
语句
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。
语法结构:
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
例子:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
else
printf("%d 是偶数\n", num);
return 0;
}
默认在 if
和 else
语句中默认都只控制⼀条语句。
例如:输入一个年龄,对年龄进行判断。
如果小于18岁,输出 未成年人,不能谈恋爱。
如果大于18岁,则输出 成年了,可以谈恋爱了。
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age <= 18)
printf("未成年人,不能谈恋爱。\n");
else
printf("成年了\n");
printf("可以谈恋爱了。\n");
return 0;
}
输入10
运行结果:
未成年人,不能谈恋爱。
可以谈恋爱了。
上面的代码,你会发现输入的值不管是>=18还是<18,"可以谈恋爱了"都会打印在屏幕上。
那如果我们要if语句同时控制2
条语句,怎么办呢?那就要使用 {}
将代码括起来,
else
后也可以跟上⼤括号。如下:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age <= 18)
{
printf("未成年人,不能谈恋爱。\n");
}
else
{
printf("成年了\n");
printf("可以谈恋爱了。\n");
}
return 0;
}
输入10
运行结果:
未成年人,不能谈恋爱。
2. if和else的嵌套使用
例如:要求输入⼀个整数,判断输入的整数是0,还是正数或者负数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num == 0)
printf("输⼊的数字是0\n");
else
{
if(num > 0) //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构
printf("输⼊的数字是正数\n");
else
printf("输⼊的数字是负数\n");
}
return 0;
}
改进一下就是:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num == 0)
printf("输⼊的数字是0\n");
else if(num > 0) //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构
printf("输⼊的数字是正数\n");
else
printf("输⼊的数字是负数\n");
return 0;
}
这就是if和else的嵌套使用。
3. 悬空else问题
如果有多个 if
和 else
,可以记住这样⼀条规则, else
总是跟最接近的 if
匹配。
例如:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
运行结果:
我们会惊奇的发现,怎么什么都没有输出。
我们细细分析,将代码改写一下,就会有惊奇的发现:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
注意⚠️点:
else
总是跟最接近的 if
匹配。
(二)、switch语句
除了 if
语句外,C语言还提供了 switch
语句来实现分⽀结构。
switch
语句是⼀种特殊形式的if...else
结构,用于判断条件有多个结果的情况。它把多重的 else if
改成更易用、可读性更好的形式。
⚠️注:
• switch
后的 n
必须是整型表达式
• case
后的值,必须是整形常量表达式
如:输入任意⼀个整数值,计算除3之后的余数
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
break
是用来终止语句的,假如没有break
语句,上面的代码将会变成这样:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
}
return 0;
}
没有break
语句,代码将会一直执行下去,直到把所有代码都执行完。
当然了我们也可以利用没有break
这一特性来解决题目:
如:输入⼀个1 ~ 7的数字,数字是1 ~ 5,输出的是“工作日”; 输⼊6~7,输出“休息日”。
#include <stdio.h>
int main()
{
int day = 0;
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;
}
return 0;
}
switch语句中的default
在使用 switch
语句的时候,我们经常可能遇到⼀种情况,比如 switch
后的表达式中的值无法匹配代码中的 case
语句的时候,这时候要不就不做处理,要不就得在 switch
语句中加⼊default
⼦句。
如:输入⼀个1 ~ 7的数字,数字是1 ~ 5,输出的是“工作日”; 输⼊6~7,输出“休息日”。
输入1 ~ 7之外的数字,我们就输出“输入错误”;
#include <stdio.h>
int main()
{
int day = 0;
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("输⼊错误\n");
break;
}
return 0;
}
二、循环结构
(一)、while循环
1. 语法形式
while
语句的语法结构和 if
语句非常相似。
while(表达式)
语句;//如果循环体想包含更多的语句,可以加上⼤括号
首先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下⼀次判断。
2. while循环的执行流程
3. while循环的实践
练习:在屏幕上打印 1~10 的值
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i = i+1;
}
return 0;
}
(二)、for循环
1. 语法形式
for(表达式1; 表达式2; 表达式3)
语句;//如果循环体想包含更多的语句,可以加上⼤括号
表达式1用于循环变量的初始化
表达式2用于循环结束条件的判断
表达式3用于循环变量的调整
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。
2. for循环的执行流程
3. for循环的实践
练习:在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
while
循环和for
循环的对比
for
和 while
在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for
循环的三个部分非常集中,便于代码的维护,而如果代码较多的时候 while
循环的三个部分就比较分散,所以从形式上 for
循环要更优⼀些。
(三)、do while循环
1. 语法形式
do
语句;
while(表达式);
while
和 for
这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;
而 do while
循环则是先直接进入循环体,执行循环语句,然后再执行 while
后的判断表达式,表达式为真,就会进行下⼀次,表达式为假,则不再继续循环。
2. do while循环的执行流程
3. do while循环的实践
练习:在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i = i + 1;
}while(i<=10);
return 0;
}
(四)、break和continue语句
在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环,这是非常常见的现象。C语言中提供了 break
和 continue
两个关键字,就是应用到循环中的。
break
的作用是用于永久的终止循环,只要break
被执行,直接就会跳出循环,继续往后执行。continue
的作用是跳过本次循环中continue
后边的代码,在for
循环和while
循环中有所差异的。
break
举例:
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;//当i等于5后,就执⾏break,循环就终止了
printf("%d ", i);
i = i + 1;
}
return 0;
}
打印了1,2,3,4
后,当i
等于5
的时候,循环在 break
的地方终止,不再打印,不再循环。
continue
举例:
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;//当i等于5后,就执⾏continue,就跳过了后面语句的执行,开始执行下一个语句
printf("%d ", i);
i = i + 1;
}
return 0;
}
打印了1,2,3,4
后,当i
等于5
的时候,循环在执行完 continue
后不在执行后面的语句,不在执行i = i + 1
语句,程序陷入死循环。
在for
语句中的continue
举例:
#include <stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
printf("%d ", i);
}
return 0;
}
在for
循环中,continue
只是跳过了后边的打印,程序依然会来到了i++的调整部分 ,所以程序不会陷入死循环。
(五)、循环的嵌套
例如:找出100~200之间的素数,并打印在屏幕上。
注:素数又称质数,只能被1和本身整除的数字。
int main()
{
int i = 0;
//循环产⽣100~200的数字
for (i = 100; i <= 200; i++)
{
//判断i是否为素数
//循环产⽣2~i-1之间的数字
int j = 0;
int flag = 1;//假设i是素数
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag)
{
printf("%d ",i);
}
}
return 0;
}
(六)、goto语句
C语言提供了⼀种非常特别的语法,就是 goto
语句和跳转标号, goto
语句可以实现在同⼀个函数内跳转到设置好的标号处。
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
goto
语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以我们的建议是能不用尽量不去使用;但是 goto
语句也不是一无是处,在多层循环的代码中,如果想快速跳出,使用 goto
就非常的方便了。
例如:
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
}
error:
//...
本来 for
循环想提前退出得使用 break
,⼀个 break
只能跳出⼀层 for
循环,如果3
层循环嵌套就得使用3
个 break
才能跳出循环,所以在这种情况下我们使用 goto
语句就会更加的快捷。
完结撒花🎉!