目录
举个例子:判断输入的年龄,如果在1到18岁之间输出不可谈恋爱,否则就输出可以谈恋爱。
用switch来写星期一到星期五为学习,星期六到星期天表示休息
一。分支语句
分支语句包含if语句和switch语句
if...else语句
int main()
{
if (表达式)
{
语句1;
}
else
{
语句2;
}
return 0;
}
表达式结果为真(非0)那就执行语句1,否则执行语句2。
举个例子:判断输入的年龄,如果在1到18岁之间输出不可谈恋爱,否则就输出可以谈恋爱。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int age = 0;
printf("请输入你的年龄:");
scanf("%d", &age);
if (0 < age < 18)
{
printf("不可以谈恋爱\n");
}
else
{
printf("可以谈恋爱\n");
}
return 0;
}
运行结果:
好奇怪为什么我输入了20明明大于了18却不能谈恋爱?
原因是:你输入的20首先跟0相比较,20肯定是大于0的(为真)返回1,然后1在和18相比较,18肯定是大于1的所以表达式结果为1,就执行了语句1。所以我们发现我们不管输入什么值都是执行语句1,那这不就完犊子了?所以有没有可以改进的地方?
改进:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int age = 0;
printf("请输入你的年龄:");
scanf("%d", &age);
if (0 < age && age < 18)
{
printf("不可以谈恋爱\n");
}
else
{
printf("可以谈恋爱\n");
}
return 0;
}
&&与运算符表示两侧为真才为真,如果左侧为假就不会判断右侧的了,因为有一个为假整体全都为假。但是如果左侧为真的话那还是要在判断右侧的表达式。所以我们此时在输入20 ==> (0 < 20 && 20 < 18) ,0小于20为真返回1,20小于18为假返回0,所以整体为0执行语句2。
悬空的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;
}
一般的第一次看到这个代码的读者肯定是想着输出的是haha,但是很遗憾的是这个代码什么都不会输出。
原因是:写这个代码的人故意把else和第一个if对齐导致我们以为的是如果a不等于1那就执行haha,但其实else总是跟最接近的 if 匹配,也就是说这边的else是与b等于2这个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");
}
}
这么一看就能看出如果a不等于1的话那么下面的语句都不会执行。那我们可不可以就让else和a等于1进行匹配?
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
}
switch语句
switch (expression) {
case value1: statement
case value2: statement
default: statement
}
注意:1.switch后面的expression一定要是整形表达式。
2.case 后的值必须是整形常量表达式。
switch判断一个数是奇数还是偶数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int input = 0;
scanf("%d", &input);
switch (input % 2)
{
case 0:
printf("偶数\n");
break;
case 1:
printf("奇数\n");
break;
}
return 0;
}
- 注意:case 和后面的数字直接必须要有空格,因为case是关键字。
- 每⼀个 case 语句中的代码执行完成后需要加上 break 才能跳出这个switch语句。
- break也并不是每个case语句执行完都要加break,具体还是要看需求。
用switch来写星期一到星期五为学习,星期六到星期天表示休息
#define _CRT_SECURE_NO_WARNINGS 1
#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;
}
如果我们在1和5之间都写入共同的语句(休息日)和break虽然也可以但是代码却冗余了 。
default表示如果你输入的数字不是1到7之间那么就执行default后面的语句,这有点像if语句中的else。
那我们既然有了if语句那为什么还要有switch语句?
switch 是多分支选择语句,而 if 语句只有两个分支可供选择。虽然可以用嵌套的 if 语句来实现多分支选择,但那样的程序冗长难读。但是switch也有局限性那就是对判断条件很严苛,case后面只能跟整形常量,有些时候如果漏写了break很有可能会导致程序出现bug,if语句相对来说就比较灵活,而且如果判断条件较少的话,使用if语句更好。
二。循环语句
for循环语句
for (表达式1; 表达式2; 表达式3)
- 表达式1:表示初始化,只会执行一次
- 表达式2:条件判断,为真执行语句
- 表达式3:变量调整
for循环执行流程图
打印1~100之间9的个数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
// 9,19,29,39,49,59,69,79,89,90,91,92,93,94,95,96,97,98,99
int main()
{
int i = 0;
int count = 0;//统计9的个数
for (i = 1; i <= 100; i++)
{
if (i % 10 == 9)
{
count++;
}
if (i / 10 == 9)
{
count++;
}
}
printf("1到100中9个个数:%d\n", count);//20个
return 0;
}
for循环搭配break
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
break;
}
printf("%d ", i);
}
}
运行结果:
我们可以看到当i等于5时执行了break就退了for循环,所以break作用是终止循环不在执行循环体的内容,如果有嵌套循环就转到使用了break循环外的语句。
for循环搭配continue
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
continue;
}
printf("%d ", i);
}
}
运行结果
我们可以看到这里并没有打印5,是因为当i等于5时执行continue就没有执行后面的输出语句,而是执行了表达式3(i++),所以continue的作用是结束本次循环,进行下一次循环,而不终止整个循环的执行。
- 接下来我要介绍while循环语句。
- 这里注意体会for循环和while的差别
while循环
首先就是判断表达式是否为真,表达式的值为0表示假,就不进入循环语句中。表达式的值非0表示真,就执行循环体语句的内容,执行完成再次来到判断表达式中,循环反复直到表达式为假就跳出循环。
输入一个正的整数,逆序打印这个整数的每一位
#include <stdio.h>
int main()
{
int input = 0;
scanf("%d", &input);
while (input)
{
printf("%d ", input % 10);//得到个位数
input /= 10;//去掉个位数
}
return 0;
}
运行结果:
while搭配break
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
{
break;
}
printf("%d ", i);
i++;
}
return 0;
}
运行结果:
有此我们可以看出来档i等于5时就执行了break语句,直接结束了while循环。
while搭配continue
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
{
continue;
}
printf("%d ", i);
i++;
}
return 0;
}
运行结果 :
此时白色光标一直在4后面闪烁,因为这个代码死循环了。因为我们把i++这个调整语句放在了continue下面,也就是说当i等于5的时候就执continue(不执行下面的语句直接跳转到判断表达式中),因为i等于5是小于10的所以表达式为真,执行循环语句,但由于i一直是5所以if语句总为真,这就一直执行continue导致i++没有机会得到执行,循环反复这个循环就一直停不下来。
for循环和while的差别
因为for循环的初始化,判断语句,调整部分是写在一块的所以维护起来是十分方便的。 while循环:如果代码量比较多,那么while循环的初始化,判断语句,调整部分就会比较分散,不利于代码的维护,所以一般情况下使用for循环跟多
- 接下来我要介绍do-while循环语句
- 这里注意体会while循环和do-while的区别
do-while
输入一个大于等于0的整数,计算这个数有几位
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int n = 0;
int sum = 0;
scanf("%d", &n);
int k = n;
do
{
sum++;
n /= 10;
} while (n);
printf("%d有%d位\n", k, sum);
return 0;
}
运行结果:
这里可以看出来do-while是先执行完语句才判断表达式,所以输入0也算1位
do while搭配break
#include <stdio.h>
int main()
{
int n = 1;
do
{
printf("%d ", n);
if (n == 5)
{
break;
}
n++;
} while (n <= 10);
return 0;
}
这里因为是先输出,所以输出结果是1 2 3 4 5,由于n等于5时执行了break所以退出了循环
do while搭配continue
#include <stdio.h>
int main()
{
int n = 1;
do
{
printf("%d ", n);
if (n == 5)
{
continue;
}
n++;
} while (n <= 10);
return 0;
}
运行结果是:
因为我们是先输出,所以i等于5的时候就执行了continue跳转到表达式判断中,这就导致了i++一直没机会执行,所以就一直输出5形成了死循环
do while 和 while 的区别
- do while 是先执行一次语句在判断表达式,要是表达式为假就退出,为真就继续循环,至少执行一次。
- while 先判断表达式,为假就退出循环,为真就执行循环体的内容。
-
接下来我介绍下goto语句
goto语句是一个分支语句,有类似循环的作用,goto语句搭配跳转标号可以实现在同一个函数内跳转到设置好的标号处。
#include <stdio.h>
int main()
{
printf("haha\n");
goto xh;
printf("xixi\n");
xh:
printf("hehe\n");
return 0;
}
运行结果:
我们可以看到当语句执行到goto的时候就跳转到设置好的标记处然后再执行标记处下的代码
goto语句也称为无条件转移语句,所以不建议使用goto语句,因为它会打乱程序的正常执行流程使程序的控制流难以跟踪,使程序难以理解和难以修改,但goto语句也不是一无是处,比如如果是在多层嵌套语句中,要想一下子退出多层循环就可以使用goto。
for (...)
{
for (...)
{
for (...)
{
if (disaster)
goto error;
}
}
}
error:
//...