C语言是结构化的程序设计语言 ,这里的结构化指的是顺序结构、选择结构、循环结构,我们日常 生活里的事情都可以拆分为这三种结构;
我们可以使用if、switch实现分支结构,使用for、while、do while实现 循环结构。
一.分支结构
1.1 if语句
if语句的格式如下
if (表达式)
语句
当表达式为真(成立 ),就执行语句;反之则不执行
在c语言中,“0”表示假,非零表示为真,也就是如果表达式的结果为零,则语句不执行;如果表达式的结果不为零,则语句执行。
1.2 else语句
else语句的格式如下
if (表达式)
语句;
else
语句;
else语句总是和if语句连用(有 else就有if,有if不一定有else)
else语句考虑的是if语句其他的情况,比如if判断的是奇数,那么else判断的就是偶数
练习:输入一个数,判断它是奇数还是偶数
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a % 2 == 1)
printf("是奇数");
else
printf("是偶数");
return 0;
}
1.3 多分支情况
在if语句中默认if和else控制一条语句,比如
#include <sdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a > 1)
printf("hehe\n");
printf("haha\n");
}
不论输入的a是否大于1,都会打印haha
这是因为 printf("haha\n"); 不受if管理,是一个单独的语句,想解决这个问题只需要用{}把两条语句括起来就行:
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a > 1)
{
printf("hehe\n");
printf("haha\n");
}
}
想要if或else控制多条语句,只需要用{}把语句括起来就行
1.4 嵌套if语句
在if else语句中else可以与另一个if语句连用,构成多重判断
比如:要求输入一个整数,判断 输入的整数是0,还是正数或是负数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("输入的数字是0");
else if (num > 0)
printf("输入的数字是正数");
else
printf("输入的数字是负数");
return 0;
}
有了嵌套if,我们就可以实现更多复杂的运算
1.5 悬空else问题
如果有多个if和else语句,记住else总是和它最近的if匹配
下面这个代码结果是啥
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("haha");
else
printf("hehe");
return 0;
}
如果你的答案是打印hehe,那你就掉进陷阱了,其实结果是啥都不输出
这就是悬空else的问题,如果有多个if和else,记住else总是和最近的if匹配。由于上面的排版,导致else看起来是和第一个if匹配的,实际上是和第二个if匹配,如果将代码改成下面的格式就更容易理解了
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("haha");
else
printf("hehe");
}
return 0;
}
如果我们确实希望else和第一个if匹配,那我们可以这样改
#include <sdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("haha");
}
else
printf("hehe");
return 0;
}
只要使用适当的大括号,就可以帮我们解决很多问题,让代码可读性更高
2.1 switch语句
switch语句是一种特殊的if...else 语句,用来判断条件有多个结果的情况。
格式如下:
switch (表达式) {
case value1:
语句;
case value2:
语句;
default :
语句;
}
根据表达式不同的值,执行相应的case语句,没有就执行default语句
注意:
1.Switch 后面的表达式必须是整型
2.case 后面的值必须是整型常量表达式
3.case 和后面的数字之间必须有空格
2.2 if语句和switch语句对比
练习:输入一个整数值,计算除3之后的余数
如果使用if语句:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 3 == 0)
printf("余数是0");
else if (num % 3 == 1)
printf("余数是1");
else
printf("余数是2");
return 0;
}
如果使用switch语句:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
switch (num % 3 )
{
case 1:
printf("余数是1");
break;
case 2:
printf("余数是2");
break;
case 0:
printf("余数是0");
break;
}
return 0;
}
不知你们发现没有,每一个case语句后面都有一个break;接下来我们就来介绍switch 中的break·
2.3 switch中的break
之前的代码中,如果我们去除break 会是什么情况呢:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
switch (num % 3 )
{
case 1:
printf("余数是1");
case 2:
printf("余数是2");
case 0:
printf("余数是0");
}
return 0;
}
运行结果:
我们发现,4除以3余数本来是1,但运行结果却出现了余数为2和0
这是为什么呢?
原因是switch语句也是分支语句,只有通过break;才能跳出switch语句 ,如果一个case语句后面没有break,代码会继续往下执行有可能会执行其他case语句中的代码,直到遇到break或者switch语句结束,所以switch中的case语句是非常重要的,当然,也不是每一个case语句都需要break,得根据实际情况来判断
2.4 switch中的default
在使用switch语句时,会遇到一种情况,switch后的表达式中的值无法匹配case中的语句时要么就不处理,要么就加上一个default语句.
switch (表达式) {
case value1:
语句;
case value2:
语句;
default :
语句;
}
switch中的表达式结果不是value1,也不是value2时,就会执行default语句.
2.5 switch中case和default的顺序问题
在switch语句中,case和default是没有顺序要求的,不过我们通常把default放在最后
二.循环结构
1.1 while循环
while语句的格式如下:
while(表达式)
语句;
1.2 while循环的实践
练习:在屏幕上打印1-10的值
#include <stdio.h>
int main()
{
int i = 0;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
练习:输入一个正整数,逆序打印这个整数的每一位
列如:
输入:1234 输出:4 3 2 1
输入:521 输出:1 2 5
题目解析:
1.要想求每一位,用n % 10就行
2.去掉n的最低位,用n /= 10就行
3.循环1和2两步,就能得到所有位
参考代码:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while (n)
{
printf("%d ", n % 10);
n /= 10;
}
return 0;
}
2.1 for循环
for循环是所有循环里用得最多的,格式如下::
for (表达式1;表达式2;表达式3)
语句;
表达式1 用于项目初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
执行顺序:表达式1->表达式2->语句->表达式3
练习:在屏幕上打印1-10
#include <stdio.h>
int main()
{
for (int i = 0; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
2.2 while循环和for循环的对比
for循环的初始化,判断,调整比较集中,便于代码的维护
while循环适合代码较多的时候
3.1 do while循环
语句结构如下:
do
语句;
while(表达式);
do while语句的循环体至少执行一次,这是其比较特殊的地方
练习:输入一个正整数,判断这个数是几位数
列如:
输入:1234 输出:4
输入:12 输出:2
参考代码:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int count = 0;
do
{
n /= 10;
count++;
} while (n);
printf("%d", count);
return 0;
}
4. break和continue
4.1 while循环中的break和continue
break举例
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d", i);
i = i + 1;
}
return 0;
}
执行结果
break的作用就是永久的终止循环,只要break被执行,break外的一层循环就会结束
continue举例
如果把上面的break替换为continue会是什么结果呢?
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d", i);
i = i + 1;
}
return 0;
}
运行结果
当i=5后,就执行continue,跳过continue的代码,因为跳过了i = i+1,所以i一直为5,陷入了死循环。
4.2 for循环中的break和continue
break举例:
#include <stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
continue举例:
#include <stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
未来当某个条件发生时,本次循环无需再执行后续某些操作时,就可以使用continue来实现。
4.3 do while循环中的break和continue
do while循环中的break和continue和while循环中的break和continue几乎一模一样
5. 循环的嵌套
练习:
找出100-200之间的素数,打印在屏幕上
注:素数又称质数,只能被1和其本身整除
解析:
1.要从100-200之间找出素数,首先得有100-200之间的数,可以用循环产生
2.要判断i是否是素数,要拿2~i-1之间的数字去试除i,需要产生2~1-1之间的数字,也可以使用循环解决
参考代码:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)
{
int j = 0;
int flag = 1;
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
printf("%d ", i);
}
return 0;
}
6.go to语句
go to语句可以实现在同一个函数内跳转到设置好的标号处
例如:
#include <stdio.h>
int main()
{
printf("heeh\n");
goto next;
printf("sjd\n");
next:
printf("hahah\n");
return 0;
}
goto语句如果使用不当,就会导致在函数内部随意乱跳转,打乱程序的执行,但goto语句并不是一无是处,在多层循环中使用goto就非常方便了
for (...)
{
for (...)
{
for (...)
{
for (...)
{
if (disaster)
goto error;
}
}
}
error:
}
如果使用break跳出循环,那么就需要3个break,这种情况下使用goto语句就会更快一些
完