一、什么是语句?
C语言中由一个分号 ; 隔开的就是一条语句。
printf("hehe");
;//空语句
1+2;
二、分支语句(选择结构)
1. if语句
🌟语法结构🌟
if (表达式)
语句;
if (表达式)
语句1;
else
语句2;
多分支🌿
if (表达式1)
语句1;
else if (表达式2)
语句2;
else
语句3;
1.1 悬空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;
}
1.2 if书写形式的对比
//代码1
if (condition) {
return x;
}
return y; //若调用函数,遇到return则返回,不会执行其后代码
//代码2
if(condition)
{
return x;
}
else
{
return y;
}
代码1和代码2都为正确代码,但是代码2更加规范。
//代码3
int num = 1;
if(num == 5)
{
printf("hehe\n"); //若有错误不易被发现
}
//代码4
int num = 1;
if(5 == num) //可避免错误不被发现
{
printf("hehe\n");
}
代码3和代码4都为正确代码,但是代码4更加好用,可以避免将“==”写成“=”的错误!
1.3 练习
🌸 判断一个数是否为奇数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a % 2 == 1)
printf("Yes\n");
else
printf("No\n");
return 0;
}
🌸 输出1-100之间的奇数
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 100)
{
//判断i是否为奇数
if (i % 2 == 1)
printf("%d ", i);
i++;
}
return 0;
}
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 100)
{
printf("%d ", i);
i += 2;
}
return 0;
}
1.4 注意
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)//如果表达式的结果为真,则语句执行。(0表示假,非0表示真)
{
printf("少年\n");
}
else if (age >= 18 && age < 30)
{
printf("青年\n");
}
else if (age >= 30 && age < 50)
{
printf("中年\n");
}
else if (age >= 50 && age < 80)
{
printf("老年\n");
}
else
{
printf("老寿星\n");
}
return 0;
}
💡如果将age >= 18 && age < 30写成18<=age<30会怎样呢?
#include <stdio.h>
int main()
{
int age = 10;
if (18 <= age < 30)
printf("青年\n");
else if (age >= 30 && age < 50)
printf("中年\n");
else if (age >= 50 && age < 80)
printf("老年\n");
else
printf("老寿星\n");
return 0;
}
👀原因:
如果age=10,则10>=18为假,假为0,进而有0<30为真,故输出青年。
❗❗❗
注意不能用数学形式写表达式,会产生错误。 |
2. switch语句
switch语句也是一种分支语句。常常用于多分支的情况。
switch(整型表达式)
{
语句项;
}
而语句项是什么呢?
//是一些case语句:
//如下:
case 整形常量表达式:
语句;
2.1 在switch语句中的 break
在switch语句中,我们没法直接实现分支,搭配break使用才能实现真正的分支。
#include <stdio.h>
int main()
{
int day = 1;
switch (day)
{
case 1:
printf("星期一\n");
case 2:
printf("星期二\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
case 5:
printf("星期五\n");
case 6:
printf("星期六\n");
case 7:
printf("星期天\n");
}
return 0;
}
💡 加上break会得到想要的结果吗?
#include <stdio.h>
int main()
{
int day = 1;
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
break语句的实际效果是把语句列表划分为不同的部分。 |
2.2 default子句
💡 如果表达的值与所有的case标签的值都不匹配怎么办?
结果就是所有的语句都被跳过,程序并不会终止,也不会报错。
💡 如果在语句列表中增加一条default子句会怎样?
当 switch表达式的值并不匹配所有case标签的值时,这时default子句后面的语句就会执行。
每个switch语句中只能出现一条default子句。
default语句可以出现在语句列表的任何位置,而且语句流会像贯穿一个case标签一样贯穿default子句。
#include <stdio.h>
int main()
{
int day = 0;
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
default: //放在前面也不影响
printf("输入错误,请输入(1 - 7)的数字\n");
break;
}
return 0;
}
2.3 练习
下面代码结果是什么?
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{//switch允许嵌套使用
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
三、循环语句
1. while循环
while(表达式)
循环语句;
while 语句的执行流程图
1.1 while语句中的break和continue
🌸 break介绍
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
i = i + 1;
if (i == 5)
break; //用于终止整个循环
printf("%d ", i);
}
return 0;
}
//代码输出结果为:2 3 4
总结break在while循环中的作用:
其实在循环中只要遇到break,就直接跳出当前循环(只跳出一层循环)。 |
如果你的循环是嵌套循环,那么需要按照嵌套的层次逐步使用break跳出循环。 |
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
i = i+1;
if(i == 5)
continue;
//跳过本次循环continue后面的代码,直接去while循环的判断部分。
printf("%d ", i);
}
return 0;
}
总结continue在while循环中的作用:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。 |
2. for循环
for(表达式1;表达式2;表达式3)
循环语句;
表达式1
表达式1为初始化部分,用于初始化循环变量的。(初始化部分只执行了一次)
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
for 语句的执行流程图
2.1 对比for和while循环
int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
printf("hehe\n");
i = i+1;//调整部分
}
//实现相同的功能,使用for
for(i=1; i<=10; i++)
{
printf("hehe\n");
}
结论:
while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。for循环使用的频率也最高。
2.2 for循环中的break和continue
我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。但是还是有些差异:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
//运行结果:1 2 3 4 6 7 8 9 10
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
i = i+1;
}
return 0;
} //死循环
2.3 for语句的循环控制变量
#include <stdio.h>
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", i);
i = 5;
}
return 0;
}
不可在for 循环体内修改循环变量,防止 for 循环失去控制。 |
int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}
建议for语句的循环控制变量的取值采用“前闭后开区间”写法。 |
2.4 一些for循环的变种
#include <stdio.h>
int main()
{
//变种1
for(;;)
//for循环的初始化、判断、调整是可以省略的。判断部分如果省略意味着判断条件恒为真,导致死循环。
{
printf("hehe\n");
}
//变种2
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}
👀👀👀比较两段代码:
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
printf("hehe\n");
}
}
return 0;
}
结果:打印出100个hehe
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (; i < 10; i++)
{
for (; j < 10; j++)
{
printf("hehe\n");
}
}
return 0;
}
结果:打印出10个hehe
✨原因:i=0时,j循环10次打印出10个hehe后,j的值变为10,不再初始化。
for循环中,三个条件最好不要省略。 |
2.5 笔试题
//请问循环要循环多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
k++;
return 0;
}
//循环0次。因为判断部分k=0,所以条件为假,则不运行。
3. do…while()循环
do
循环语句;
while(表达式);
do 语句的执行流程图
3.1 do语句的特点
循环至少执行一次,使用的场景有限,所以不是经常使用。
#include <stdio.h>
int main()
{
int i = 10;
do
{
printf("%d\n", i);
}while(i<10);
return 0;
}
//10
3.2 do while循环中的break和continue
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
if(i==5)
break;
i++;
} while (i <= 10);
return 0;
}
//1 2 3 4 5
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
if(i==5)
continue;
i++;
} while (i <= 10);
return 0;
}
//死循环
如有问题,欢迎批评指正呀!