(写在前面:文中的概念解释为个人理解+课件所学,题目借用课件的,代码为笔者学习后所写)
(主要为记录学习过程所用)
目录
1.if语句
1.1 if格式
if(表达式)
printf("输出语句")
表达式成立则运行,表达式不成立不执行语句
在C语言中0表示假,非0表示真。
实例1:判断一个数是奇数还是偶数
int main()
{
int a = 0;
scanf("%d", &a); //&表示将输入的数存储到a中
if (a % 2 == 0)
printf("a=%d为偶数", a);
return 0;
}
如果我们给a赋值为偶数,那么输出结果如果图所示

1.2 else
如果我们输入的数不是偶数而是奇数,那么运行上述代码就不会输出结果,因此我们需要用到else语句来弥补这点
以下为else的具体用法
if(表达式)
输出语句1
else
输出语句2
我们带入实例中查看
int main()
{
int a = 0;
scanf("%d", &a);
if (a % 2 == 0) //判断a除以2的模是否为0
printf("a=%d为偶数", a);
else
printf("a=%d为奇数", a);
return 0;
}
此时我们再输入一个奇数就会判断输出该数为奇数,从而形成了一个完整的体系。

实例2:根据一个人的年龄判断他是否成年
int main()
{
int age = 0; //定义年龄age为0
printf("请输入您的年龄:");
scanf("%d", &age);
if (age <= 18) //对年龄进行判断如果小于18就输出语句1,相反输出语句2
printf("未成年"); //语句1
else
printf("成年"); //语句2
return 0;
}
1.3 分⽀中包含多条语句
int main()
{
int age = 0; //定义年龄age为0
printf("请输入您的年龄:");
scanf("%d", &age);
if (age >= 18)
printf("成年\n");
printf("可以恋爱了\n");
return 0;
}
我们再来运行以上代码
可以看到如果我们输入比18大的数,就会输出

如果我们输入比18小的数的话

虽然经过判断没有成年,从而没有输出“成年”这个结果。但是“可以恋爱仍然作为结果输出”,此时就存在缺陷,因为代码中的if这时只能控制一条语句,下面我们就来看一下如何用if控制这两条语句
我们需要用到{}这个符号
int main()
{
int age = 0; //定义年龄age为0
printf("请输入您的年龄:");
scanf("%d", &age);
if (age >= 18)
{
printf("成年\n");
printf("可以恋爱了\n");
}
return 0;
}
这样用{}括起来后我们再输入比18小的数就没有语句输出了,我们就达到了用if控制两条语句的目的。

我们再来完善一下代码让其成为一个完整判断的程序
int main()
{
int age = 0; //定义年龄age为0
printf("请输入您的年龄:");
scanf("%d", &age);
if (age >= 18)
{
printf("成年\n");
printf("可以恋爱了\n");
}
else
{
printf("未成年\n");
printf("不可以谈恋爱\n");
}
return 0;
}
1.4 嵌套if
int main() {
int a = 0;
scanf("%d", &a);
if (a > 0)
printf("输入的数字为正数");
else if (a < 0)
printf("输入的数字为负数");
else
printf("输入的数字为0");
return 0;
}
第二个if else就为嵌套在前面一个else中的嵌套if语句。
int main() {
int b = 0;
scanf("%d", &b);
if (b > 0)
{
if (b % 2 == 0)
printf("该数为偶数");
else
printf("该数为奇数");
}
else
printf("该数为非正数");
return 0;
}
运行逻辑为,先根据输入的b的值进行大于0 小于0的判断
如果大于0,则进行嵌套里的奇偶性判断并输出,如果小于0则会绕过嵌套里的判断,直接输出该数为非正数。
练习:
int main() {
int age = 0;
scanf("%d", &age);
if (age <= 18)
printf("少年");
else if (age <= 44)
printf("青年");
else if (age <= 59)
printf("中老年");
else if (age <= 89)
printf("老年");
else
printf("老寿星");
return 0;
}
方法2:
int main() {
printf("请输入年龄:");
int age = 0;
scanf("%d", &age);
if (age <= 18)
printf("少年");
else {
if (age <= 44)
printf("青年");
else {
if (age <= 59)
printf("中年");
else {
if (age <= 89)
printf("老年");
else
{
printf("老寿星");
}
}
}
}
根据大括号可以更清晰的看出运行逻辑,注意括号要完成前后的对应。
1.5 悬空else问题
int main()
{
int a = 1;
int b = 2;
if (a == 0)
if (b == 0)
printf("hehe\n");
else
printf("haha\n");
return 0;
}

int main()
{
int a = 1;
int b = 2;
if (a == 0)
{
if (b == 0)
printf("haha\n");
else
printf("hehe\n");
}
return 0;
}
如果我们想要else与第一个if匹配进行判断,可以改为以下代码
int main()
{
int a = 1;
int b = 2;
if (a == 0)
{
if (b == 0)
printf("hehe\n");
}
else
printf("haha\n");
return 0;
}
这样我们再运行就会输出结果“haha”
2. 关系操作符
if (x == 3)
{
printf("x is 3.\n");
}
注意:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。有时候,可能会不⼩⼼写 出下⾯的代码,它可以运⾏,但很容易出现意料之外的结果。
if (x = 3) ...
if ( 3 == x ) ....
但如果是给x赋值的话这样写就会报错
if (3=x).... //错误示例
i<k<j //错误示范
因为代码从左向右运算,所以只会先判断i<k而不会对k和j进行判断,所以达不到我们的目的
应该写成
i<j && j<k
//错误示例
int main()
{
int age = 0;
printf("请输入年龄:");
scanf("%d", &age);
if (18 <= age <= 36)
printf("青年");
return 0;
}
这样我们输入10,也会输出青年
因为我们的10先和18进行比较,为假输出0,0接着与36进行比较为真,满足条件就会输出青年
正确写法应该如下所示:
int main()
{
int age = 0;
printf("请输入年龄");
scanf("%d", &age);
if (age >= 18 && age <= 36)
printf("青年");
return 0;
}
3. 条件操作符
exp1 ? exp2 : exp3
exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
使用条件操作符改造以下代码
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
if (a > 5)
b = 3;
else
b = -3;
printf("%d\n", b);
return 0;
}
改造后:
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
b = (a > 5 ? 3 : -3);
printf("%d\n", b);
return 0;
}
练习:使⽤条件表达式实现找两个数中较⼤值
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int m = (a > b ? a : b); //a>b相当于exp1 a相当于exp2 b相当于exp3
printf("%d", m);
return 0;
}
运行逻辑:首先输入a 和b 的值,对于a和b的大小进行判断,如果满足a>b则输出a的值,a<b则会输b的值。并把这个值赋给m进行输出。
4. 逻辑操作符:&& , || , !
4.1 逻辑取反运算符 !
int main() {
int flag = 0;
if (!flag)
printf("do something\n");
return 0;
}
4.2 逻辑与运算符

int main()
{
int month = 0;
scanf("%d", &month);
if (month >= 6 && month <= 8);
printf("%d月为夏天", month);
return 0;
}
4.3 逻辑或运算符

int main()
{
int month = 0;
scanf("%d", &month);
if (month == 12 || month == 1 || month == 2)
printf("%d月为冬天", month);
return 0;
}
4.4 练习:闰年的判断
int main() {
int year = 0;
printf("请输入年份:");
scanf("%d", &year);
if (year % 4 == 0 && year % 100 != 0)
printf("%d为闰年\n", year);
else if (year % 400 == 0)
printf("%d为闰年\n", year);
return 0;
}
代码2:
int main()
{
int year = 0;
printf("请输入年份:");
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 == 0) || (year % 400 == 0))
printf("%d为闰年\n",year);
else
printf("%d为平年\n", year);
return 0;
}
4.5 短路
if(month >= 3 && month <= 5)
if(month == 12 || month == 1 || month == 2)
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
printf("i=%d\n", i);
return 0;
}
我们首先对a++进行分析,a定义为0,a++为先用在加,所以在i的运算中a作为0带入,运算后a的值自加1变为a=1,由上文可知对于&&操作符,左边如果是0(假),右边操作数就不再进行运算,即b , c ,d的值直接输出。因为后面的bc不再进行运算,所以i的值就等于由a带入的0。最终输出结果如下图所示:

PS:如果我们把a的值换成1那么输出的值会有什么变化
int main()
{
int i = 0, a = 1, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
printf("i = %d\n", i);
return 0;
}
结果如图:

分析:首先a=1带入进i的运算,运算后a的值变为2。这时第一个&&操作符左边为真,继续进行右侧的运算,根据++b,先对b的值+1,所以b的值变为3。此时第二个&&左边为真,所以继续进行右侧对d的运算,d++带入4到i的运算中,也为真,所以i的值最后为1(真)。d的值再运算过后自动+1,输出d的结果为5,c保持不变为3。
总结:只要&&操作符左边不是0就继续进行右侧的运算,如果是0就不再进行右侧的运算。是0的话判断为假,直接输出结果0。根据&&操作符的预算法则:只有两侧都为真的时候才能判断整个的为真,输出1。左右任何一侧为假都会导致整体为假,输出结果0。
5. switch 语句
switch (expression)
{
case value1: statement
case value2: statement
...
default: statement
}
5.1 if语句和switch语句的对⽐
int main() {
int b = 0;
scanf("%d", &b);
if (b % 3 == 0)
printf("余数为0");
if (b % 3 == 1)
printf("余数为1");
if (b % 3 == 2)
printf("余数为2");
return 0;
}
int main()
{
int b = 0;
scanf("%d", &b);
switch (b % 3) {
case 0:
printf("余数为0");
case 1:
printf("余数为1");
case 2:
printf("余数为2");
}
return 0;
}
代码不会出现报错,但当我们输入3时就会出现以下情况

3种运算的结果都输出了,这是什么原因呢?
switch运算法则为从上往下依次顺下来,也是包含很多分支的。当我们输入3时得到的余数为0,程序此时不会结束,而是继续向下运行下面的分支,所以输出了多个结果。
那么这时我们就需要用一个指令来让程序运行完符合的分支后就自动退出,输出结果
5.2 switch语句中的break
int main()
{
int b = 0;
scanf("%d", &b);
switch (b % 3) {
case 0:
printf("余数为0");
break;
case 1:
printf("余数为1");
break;
case 2:
printf("余数为2");
break;
}
return 0;
}
这时我们输出的结果就正常了

int main()
{
int day = 0;
scanf("%d", &day);
switch (day) {
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
case 7:
printf("星期日");
break;
}
return 0;
}
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;
}
5.3 switch语句中的default
switch (expression) {
case value1: statement
case value2: statement
default: statement
}
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;
}
5.4 switch语句中的case和default的顺序问题
6. while循环
6.1 if 和 while的对⽐
if(表达式)
语句;
while(表达式)
语句;//如果循环体想包含更多的语句,可以加上⼤括号
代码1
int main()
{
if(1)
printf("hehe\n"); //if后边条件满⾜,打印⼀次hehe
return 0;
}
代码2
int main()
{
while(1)
printf("hehe\n"); //while后边的条件满⾜,死循环的打印hehe
return 0;
}
6.2 while语句的执行流程

6.3 while 循环的实践
int main()
{
int i = 1;
while(i <= 9)
{
printf(" %d ", i);
i = i + 1; //也可以写成i++
}
return 0;
}
6.4 练习
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while(n){
printf("%d ", n % 10);
n /= 10;
}
return 0;
}
7. for循环
7.1 语法形式
for 循环是三种循环中使⽤最多的, for 循环的语法形式如下
for(表达式1; 表达式2; 表达式3)
语句;//如果循环体想包含更多的语句,可以加上⼤括号
7.2 for循环的执行流程

7.3 for循环的实践
int main() {
int i = 1;
for (i = 1; i <= 10; i++)
{
printf(" %d ", i);
}
return 0;
}
运行结果

7.4 练习
int main()
{
int i = 3;
int sum = 0;
for (i = 3; i <= 100; i += 3)
{
sum += i;
printf("%d", sum );
}
return 0;
}
8. do-while 循环
8.1 语法形式
do
语句;
while(表达式);
8.2 do while循环的实例
int main()
{
int i = 1;
do
{
printf(" %d ", i);
i += 1;
} while (i <= 10);
return 0;
}

8.3 练习
int main() {
int i = 0;
scanf("%d", &i);
int cnt = 0;
do {
cnt++;
i = i / 10;
} while (i!= 0); //当i不等于0的时候一直运行上述循环,直到i=0时停止运行
printf("%d", cnt);
return 0;
}
9. break和continue语句
9.1 while循环中的break和continue
1.break举例
#include <stdio.h>
int main()
{
int i = 1;
while(i <= 10)
{
if(i == 5)
break;//当i等于5后,就执⾏break,循环就终⽌了
printf("%d ", i);
i = i + 1;
}
return 0;
}
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 += 1;
}
return 0;
}
9.2 for循环中的break和continue
1.break 举例
int main()
{
int i = 1;
for (i = 1; i <= 10; i += 1)
{
if (i == 5)
break;
printf("%d", i);
}
return 0;
}
输出结果

2.continue举例
上面的代码,如果把 break 换成 continue 会是什么结果呢
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
printf("%d", i);
}
return 0;
}
运行结果

9.3 do while循环中的break和continue
#include <stdio.h>
int main()
{
int i = 1;
do
{
if(i == 5)
break;
printf("%d ", i);
i = i + 1;
}while(i <= 10);
return 0;
}
#include <stdio.h>
int main()
{
int i = 1;
do
{
if(i == 5)
continue;
printf("%d ", i);
i = i + 1;
}while(i <= 10);
return 0;
}
10. 循环的嵌套
10.1 练习
找出100~200之间的素数,并打印在屏幕上。注:素数⼜称质数,只能被1和本⾝整除的数字。
10.2 题目解析:
int main()
{
int x = 0;
for (x = 100; x <= 200; x++) //通过循环一次输出100-200的数,作为被除数参与运算
{
int y = 0;
int z = 0;
for (y = 2; y <= x; y++) //除去1之外,通过嵌套循环输出2-200的数,y作为除数参与运算
{
if (x % y == 0)
int z = 1; //定义如果符合x%y == 0那么z会变为1,直接通过break退出循环,
//该数不会作为结果输出
break;
}
if (z == 0) //如果不符合x%y == 0,那么z仍然是0,继续向下运行
printf(" %d ", x); //输出结果符合z == 0时x的值,即是求得的素数
}
return 0;
}
int main() {
int m = 100;
while (m <= 200) {
int b = 1;
int n = 2;
m++;
while (n <= (m - 1)) { //确定m除以n不为自身相除
if (m% n == 0){ //不是素数
b = 0;
break;
}
else
n++;
}
if (b == 1)
printf("%d ", m);
}
return 0;
}
两种代码最后结果是一样的:

11. goto 语句
是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以我们的建 议是能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出,使⽤ goto 就非常的方便了。
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
}
error:
//...
插入不了文本了就用这个代码框进行一个结尾吧。
完,2025.10.12 23:40:18
笔者:John Wick

被折叠的 条评论
为什么被折叠?



