C语言是结构结构化的程序语言设计,结构指:循环结构,选择结构,循环结构。
用if,switch实现分支结构,使用for,while,do-while实现循环结构。
1.if语句
if语句形式如下:
if ( 表达式 )
语句
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行
C语言中,0为假,非0表示真,也就是表达式的结果是0,则语句不执行,表达式的结果不是0,语句执行
例子:输入一个整数,判断是否为奇数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
return 0;
}
1.2 else
如果一个数不是奇数,那就是偶数了,如果任意一个整数,我们要清楚的判断是奇数还是偶数。
就要用到if----else----用法如下:
if ( 表达式 )
语句1
else
语句2
例子:输入一个偶数判断是否为奇数,是奇数就打印奇数,是偶数就打印偶数 。
#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;
}
例子2:输入一个年龄,>=18岁就输出:成年,否则就输出:未成年。
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age>=18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
1.3 分支中包含多条语句
默认if和else语句都只能控制一条语句,比如:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age >= 18)
printf("成年了\n");
printf("可以谈恋爱了\n");
return 0;
}
上面的代码,会发现输入的值不管是>=18 还是<18,“可以女朋友了”都会出现。
因为if只控制一条语句,就是printf("成年了\n");if语句为真,则打印成年了,if语句为假,则不打印,对于printf("可以恋爱了\n");是独立存在的,不管if语句条件的真假,都会被执行。那如果我们要用if同时控制两条语句,就要用{}将代码阔起来,else后也可以跟上大括号。
如下
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age >= 18) //if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
{
printf("成年了\n");
printf("可以交⼥朋友了\n");
}
return 0;
}
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age >= 18) //if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
{
printf("成年了\n");
printf("可以交⼥朋友了\n");
}
else //else 后使⽤{}控制多条语句-这个块也叫:程序块,或者复合语句
{
printf("未成年\n");
printf("不可以早恋哦\n");
}
return 0;
}
1.4 嵌套if
在if语句中,else可以与另一个if语句连用,构成多重结构判断。
比如:输入一个整数,判断输入的整数时0,还是正数或者负数。代码如下:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num == 0)
printf("输⼊的数字是0\n");
else if(num > 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
printf("输⼊的数字是正数\n");
else
printf("输⼊的数字是负数\n");
return 0;
}
上图的else if构成了嵌套的if语句。
再比如:
输入一个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数:负数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num>0)
{
if(num%2 == 0)
printf("偶数\n");
else
printf("奇数\n");
}
else
{
printf("负数\n");
}
return 0;
}
上面代码中的if语句中还有个if--else---,这样就构成了嵌套的if语句。
1.5 悬空else问题
如果有多个if和else,可以记住这样一条规则,else总最接近的if匹配。
1 #include <stdio.h>
2 int main()
3 {
4 int a = 0;
5 int b = 2;
6 if(a == 1)
7 if(b == 2)
8 printf("hehe\n");
9 else
10 printf("haha\n");
11 return 0;
12 }
这个容易被误导,容易判断a是0,不等于1,那就执行else子句,打印haha
但是在代码运行的时候,输出的结果: 。
这个就是if悬空问题,如果有多个if和else,可以记住这样一条规则,else总是跟最接近的if匹配。
上面的排版,让else和第一个if语句对齐,让我们以为else是和第一个if匹配的,当if语句不成立的时候,自然就想到是执行else子句,打印haha,但实际上else是和第二个if 进行匹配的,这样后面的if---else---语句是嵌套在第一个if语句中的,如果第一个if语句就不成立,嵌套if和else就没机会执行了,最终什么都不输出。
如果代码改成下面这样就更容易理解了
#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匹配,可以这样修改代码:
#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;
}
带上大括号代码逻辑就会更加清晰,注意大括号的使用,让代码可读性高。
2. switch语句
除了if语句外,C语言提供了switch语句来实现分支结构。
个人认为switch语句是一种特殊形式的if---else---结构,用于判断条件有多个结果的情况。他把多重的if---else---改成更易用,可读性更好的形式。
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}
注:
switch后的expression必须是整型表达式
case后面的值,必须是整型常量表达式
2.1 if语句和switch语句的对比
练习:输入一个任意整数值,计算除3之后的余数
如果使用if语句完成,如下:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if(n%3 == 0)
printf("整除,余数为0\n");
else if(n%3 == 1)
printf("余数是1\n");
else
printf("余数是2\n");
return 0;
}
如果使用switch语句改写,就可以是这样:
#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;
}
上述代码中有注意的点有:
1.case和后面的数字之间必须有空格
2.每一个case语句中的代码执行完成后,必须加上break,才可以跳出switch语句。
5.2 switch语句中的break
前面的代码如果去掉case语句中的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;
}
结果:
7除以3本来余数是1,但是我们发现程序运行的结果多了一行“余数是2”。
原因是switch语句也是有分支效果的,只有在switch语句中使用break才能在跳出 switch语句,如果某一个case语句后边没有break语句,代码会继续往下执行其它的case语句中的代码,直到遇到break语句或者switch语句结束。
所以switch语句中break语句非常重要的,能实现真正的分支效果。
当然,break也不是每个case语句得有,这就是根据实际情况来看了。
1#include<stdio.h>
2int main()
3{
int day = 0;
scanf("%d", &day);
switch(day)
{case 1:
printf("星期1\n");
break
case 2:
printf("星期2\n");
break
case 3:
printf("星期3\n");
break
case 4:
printf("星期4\n");
break
case 5:
printf("星期5\n");
break
case 6:
printf("星期6\n");
break
case 7:
printf("星期天\n");
break;
}
return 0;
}
需求改变时,变为:
1.输入1-5,输出“工作日”;
2.输入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;
}
2.3 switch语句中的default
就拿上面的 星期的例子来说,如果我要输入的值不是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;
}
2.4 switch语句中的case和default的顺序问题
在switch语句中case子句和default子句没有要求顺序,default不止可以放在最后,只要是你的顺序满足实际需求就可以了。
通常我们把default子句放在最后处理的。
3. while循环
C语言有三种循环语句,while就是其中一种。
3.1 if 和 while的对比
if(表达式)
语句;
while(表达式)
语句//如果想在循环体中包含更多的语句,可以加上大括号
具体看一个代码:
#include <stdio.h>
int main()
{
if(1)
printf("hehe\n");//如果条件满足。打印一次hehe
return 0;
}
#include <stdio.h>
int main()
{
while(1)
printf("hehe\n");//while满足后边条件,死循环打印hehe
return 0;
}
3.2 while语句执行流程
3.3 while循环的实践
例子:输出1--10的值
#include <stdio.h>
int main()
{
int i = 1;
while(i <= 10);
{
printf("%d",i);
i = i + 1;
}
return 0;
}
4 for循环
4.1 语法型式
个人觉得for循环时使用最多的,for循环的语法形式如下:
for(表达式1;表达式2;表达式3)
语句//如果循环体包含更多语句,可以加上大括号
表达式1 用于循环变量初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
4.2 for循环代码实践
输出1--10的值:
#include <stdio.h>
int main ()
{
int i = 0;
for(i=1;i<=10;i++)
{
printf("%d",i);
}
return 0;
}
4.3 while循环和for的对比
用while循环
#include <stdio.h>
int main()
{
int i = 1;//初始化
while(i <= 10)//判断
{
printf("%d",i);
i = i + 1;//调整
}
return 0;
}
#include<stdio.h>
int main()
{
int i = 0;
//初始化//判断//调整
for(i = 1;i <= 10;i++)
{
printf(“%d”,i);
}
return 0;
}
for和while都会用到实现循环的过程有初始化,判断,调整这三部分,但是for循环的三个部分非常集中,对于我个人来说从形式上for更优。