一. 顺序结构
二. 选择结构
if、switch语句
2.1 if语句
2.1.1 if
1 if ( 表达式 )
2 语句
2.1.2 else
1 if ( 表达式 )
2 语句1
3 else
4 语句2
2.1.3 分支中包含多条语句
2.1.4 嵌套if
比如:
//要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("输入的数字是0\n");
else if (num > 0)
printf("输入的数字是正数\n");
else
printf("输入的数字是负数\n");
return 0;
}
//输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:⾮正数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num > 0)
{
printf("正数\n");
if (num % 2 == 0)
printf("偶数\n");
else
printf("奇数\n");
}
else
printf("非正数\n");
return 0;
}
2.1.5 悬空else问题
2.2 switch语句
1 switch (expression) {2 case value1: statement3 case value2: statement4 . . .5 default: statement6 }
2.2.1 if和switch语句的对比
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 3 == 0)
printf("余数为0\n");
else if (num % 3 == 1)
printf("余数为1\n");
else
printf("余数为2\n");
return 0;
}
switch语句:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
int rem = num % 3;
switch (rem)
{
case 0:
printf("余数是0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
注:
2.2.2 switch中的break
每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执⾏,有可能执⾏其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束
2.2.3 switch中的default
1 switch (expression) {2 case value1: statement3 case value2: statement4 default: statement5 }
比如上面:switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执default 子句
2.2.4 case和default的顺序问题
在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要其顺序是满⾜实际需求的就可以。不过我们通常是把 default ⼦句放在最后处理的
三. 操作符
3.1 关系操作符
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 相等 |
!= | 不相等 |
2. 多个关系运算符不宜连用(连用合法但不建议用)
3.2 条件操作符
条件操作符也称三目操作符,需要接受三个操作数
形式如下:
1 exp1 ? exp2 : exp3
它的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果exp1 为假, exp3 计算,计算的结果是整个表达式的结果
举例:
//使⽤条件表达式实现找两个数中较⼤值
int main()
{
int a = 0, b = 0;
scanf("%d %d", &a, &b);
printf("%d", a > b ? a : b);
return 0;
}
区分:逗号表达式
逗号表达式,会从左到右依次计算,但是整个表达式的结果是最后一个表达式的结果
int main()
{
int b = 0;
int c = 4;
int a = (a = 3, a + 3, b = c * 3, c = 2 * a + b);
// a = 3 b = 12 c = 18
printf("%d\n", a);
printf("%d\n", c);
return 0;
}
//输出结果:
//18
//18
3.3 逻辑操作符
! | 逻辑取反运算符(改变单个表达式的真假) |
&& | 逻辑与运算符,“并且”(两侧的表达式都为真,则为真,否则为假) |
|| | 逻辑或运算符,”或者“(两侧至少有一个表达式为真,则为真,否则为假) |
//输⼊⼀个年份year,判断year是否是闰年
//闰年判断的规则:
//1. 能被4整除并且不能被100整除是闰年
//2. 能被400整除是闰年
int main()
{
int year = 0;
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
printf("是闰年\n");
else
printf("不是闰年\n");
return 0;
}
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
return 0;
}
//运行结果
//a = 1
//b = 2
//c = 3
//d = 4
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
//i = a++ && ++b && d++;
i = a++||++b||d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
return 0;
}
//运行结果:
//a = 1
//b = 3
//c = 3
//d = 4
3.4 算术、赋值、单目操作符
见:
C语言编程指南:从数据类型到printf/scanf深度解析-CSDN博客
四. 循环结构
4.1 while循环
1 while ( 表达式 )2 语句 ; // 如果循环体想包含更多的语句,可以加上⼤括号
while 语句执行流程:
⾸先上来执⾏判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执⾏循环语句,语句执⾏完后再继续判断,是否进⾏下⼀次判断
举例:
//在屏幕上打印 1~10 的值
#include <stdio.h>
int main()
{
int num = 1;
while (num <= 10)
{
printf("%d ", num);
num++;
}
return 0;
}
//输出结果:
//1 2 3 4 5 6 7 8 9 10
4.2 for循环
1 for ( 表达式 1 ; 表达式 2 ; 表达式 3 )2 语句; // 如果循环体想包含更多的语句,可以加上⼤括号
表达式1 :⽤于循环变量的初始化
表达式2 :⽤于循环结束条件的判断
表达式3 :⽤于循环变量的调整
for 循环执行流程:
//在屏幕上打印1~10的值
int main()
{
int num = 0;
for (num = 1; num <= 10; num++)
{
printf("%d ", num);
}
return 0;
}
4.3 do-while循环
1 do2 语句;3 while ( 表达式 ) ;
区分:
也就是说,在 do while 语句中循环体是至少执行⼀次的
举例:
//在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
int num = 1;
do
{
printf("%d ", num);
num++;
}while(num <= 10);
return 0;
}
4.4 循环嵌套
将 while, do while, for 三种循环嵌套在一起就是嵌套循环
举例:判断素数
//找出100~200之间的素数,并打印在屏幕上
//注:素数称质数,只能被1和本⾝整除的数字
int main()
{
int i = 0;
//利用循环产生100~200的数字
for (i = 100; i <= 200; i++)
{
int j = 0;
int flag = 1; // 设1为素数
//循环产生2~i-1的数字,来判断是否为素数
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 0; //不是素数
break;
}
}
if (flag == 1)
printf("%d ", i);
}
return 0;
}
//运行结果
//101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
五. break,continue,goto语句
5.1 while中的break和continue
break:
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
continue:
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
//当i等于5时,执⾏continue,直接跳过continue的代码,去循环的判断的地⽅
//由于这⾥跳过了i = i+1,导致i⼀直为5,程序陷⼊了死循环
printf("%d ", i);
i = i + 1;
}
return 0;
}
//进入死循环
5.2 for中的break和continue
break:
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
//运行结果:
//1 2 3 4
continue:
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue; //这里continue跳过了后面的打印,来到i++的调整部分
printf("%d ", i);
}
return 0;
}
//运行结果
//1 2 3 4 6 7 8 9 10
5.3 do while 中的break和continue
break:
int main()
{
int i = 1;
do
{
if (i == 5)
break;
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
//运行结果
//1 2 3 4
continue:
int main()
{
int i = 1;
do
{
if (i == 5)
continue;
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
//运行结果
//1 2 3 4
5.4 goto语句
goto语句可以实现在同一个函数内跳转到设置好的标点处
举例:
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
hehe
跳过了haha的打印
goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们建议尽量不使⽤goto;但是,在多层循环的代码中,如果想快速跳出,可以使⽤ goto ,⾮常⽅便,毕竟一个 break 只能跳出一层循环
结语
让我们共同学习与提升
欢迎朋友们指出问题或者提意见~