文章目录
-
- 1. if语句
-
- 1.1 if
- 1.2 else
- 1.3 分支中包含多条语句
- 1.4 嵌套if
- 1.5 悬空else问题
- 2. 关系操作符
-
- 2.1 用法示例
- 2.2 返回值
- 2.3 注意事项
- 3. 条件操作符
-
- 3.1 计算逻辑
- 3.2 练习1:改写if-else逻辑
- 3.3 练习2:找两个数中的较大值
- 4. 逻辑操作符: && , || , !
-
- 4.1 逻辑取反运算符 !
- 4.2 逻辑与运算符 &&
- 4.3 逻辑或运算符 ||
- 4.4 练习:闰年的判断
- 4.5 短路求值
- 5. switch语句
-
- 5.1 语法形式
- 5.2 if语句和switch语句的对比
- 5.3 switch语句中的break
- 5.4 switch语句中的default
- 5.5 switch语句中case和default的顺序
- 6. while循环
-
- 6.1 if 和 while的对比
- 6.2 while语句的执行流程
- 6.3 while循环的实践
- 6.4 练习:逆序打印整数的每一位
- 7. for循环
-
- 7.1 语法形式
- 7.2 for循环的执行流程
- 7.3 for循环的实践
- 7.4 while循环和for循环的对比
- 7.5 练习:计算1~100之间3的倍数的和
- 8. do-while循环
-
- 8.1 语法形式
- 8.2 do-while循环的执行流程
- 8.3 do-while循环的实例
- 8.4 练习:计算整数的位数
- 9. break和continue语句
-
- 9.1 break的作用
-
- 9.1.1 while循环中的break
- 9.1.2 for循环中的break
- 9.1.3 do-while循环中的break
- 9.2 continue的作用
-
- 9.2.1 while循环中的continue
- 9.2.2 for循环中的continue
- 9.2.3 do-while循环中的continue
- 10. 循环的嵌套
- 11. goto语句
-
- 11.1 语法形式
- 11.2 基本用法
- 11.3 多层循环中快速跳出
C语言是结构化的程序设计语言,结构指
顺序结构、
选择结构、
循环结构。
C语言可通过
if、
switch实现选择结构,通过
for、
while、
do while实现循环结构。
1. if语句
1.1 if
if 语句的语法形式如下:
if (表达式) 语句
表达式成立(为真)则语句执行,不成立(为假)则不执行。
C语言中,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;
}
练习:输入一个年龄,>= 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) //if 后使⽤{}控制多条语句-这个块叫:程序块,或者复合语句
{
printf("成年了\\n");
printf("可以谈恋爱了\\n");
}
else //else 后使⽤{}控制多条语句-这个块也叫:程序块,或者复合语句
{
printf("未成年\\n");
printf("不可以早恋哦\\n");
}
return 0;
}
1.4 嵌套if
else可与另一个if连用,构成多重判断。
例子1:输入一个整数,判断输入的整数是 0,还是正数或者负数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num == 0)
printf("输入的数字是0\\n");
else if(num > 0) //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构
printf("输入的数字是正数\\n");
else
printf("输入的数字是负数\\n");
return 0;
}
例子2:输入一个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:非正数。
#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;
}
练习: 输入一个入的年龄 如果年龄<18岁,打印"少年" 如果年龄在18岁至44岁打印"青年" 如果年龄在45岁至59岁打印"中老年" 如果年龄在60岁至89岁打印"老年" 如果90岁及以上打印"老寿星"
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age < 18)
printf("少年\\n");
else if(age <= 44)
printf("青年\\n");
else if(age <= 59)
printf("中老年\\n");
else if(age <= 89)
printf("老年\\n");
else
printf("老寿星\\n");
return 0;
}
1.5 悬空else问题
如果有多个 if 和 else ,可以记住这样⼀条规则: 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;
}
很多初学者,上来判断第一个 if 语句,a==1为假,就觉得应该执行 else 语句,打印 haha ,但是当你去运行代码,会发现没有输出。 实际,根据 else总是与最接近的if匹配 的规则,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;
}
因a==1为假,所以无任何输出。
正例(指定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. 关系操作符
C语言中用于比较的表达式称为“关系表达式”,使用的运算符称为“关系运算符”,主要有如下6个:
- >:大于运算符
- <:小于运算符
- >=:大于等于运算符
- <=:小于等于运算符
- ==:相等运算符
- !=:不相等运算符
2.1 用法示例
a == b; // a等于b
a != b; // a不等于b
a < b; // a小于b
a > b; // a大于b
a <= b; // a小于等于b
a >= b; // a大于等于b
2.2 返回值
关系表达式返回0或1,表示真假。例如:
- 20 > 12 返回1(真)
- 12 > 20 返回0(假)
2.3 注意事项
区分==与=:==是相等运算符,=是赋值运算符,切勿混淆。例如:
if (x = 3) // 错误:将3赋值给x,返回值为3(真),if判断恒成立
if (x == 3) // 正确:判断x是否等于3
建议将常量写在等号左侧,若误写为=,编译器会报错:
if (3 == x) // 正确,误写为3 = x会报错
避免多个关系运算符连用:连续使用关系运算符不会达到预期效果。例如:
i < j < k // 实际执行:(i < j) < k,返回0或1与k比较
若需判断j在i和k之间,应使用逻辑运算符:
i < j && j < k
示例:我们输入一个年龄,如果年龄在18岁~36岁之间,输出青年。
错误示例:判断年龄在18~36岁之间
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(18 <= age <= 36) // 错误:实际执行(18<=age) <=36
printf("青年\\n");
return 0;
}
正确示例:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age >= 18 && age <= 36) // 正确:使用逻辑与运算符
printf("青年\\n");
return 0;
}
3. 条件操作符
条件操作符(三目操作符)需接受三个操作数,语法形式如下:
exp1 ? exp2 : exp3
3.1 计算逻辑
- 若exp1为真,计算exp2,结果为整个表达式的结果;
- 若exp1为假,计算exp3,结果为整个表达式的结果。
3.2 练习1:改写if-else逻辑
原代码:
#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;
}
3.3 练习2:找两个数中的较大值
#include <stdio.h>
int main()
{
int a=0;
int b=0;
scanf("%d %d", &a, &b);
int m=(a>b?a:b); // 条件操作符找最大值
printf("%d\\n", m);
return 0;
}
4. 逻辑操作符: && , || , !
逻辑运算符用于构建复杂表达式,提供逻辑判断功能,共3个:
- !:逻辑取反运算符(改变单个表达式的真假);
- &&:逻辑与运算符(两侧表达式都为真,结果才为真,否则为假);
- ||:逻辑或运算符(两侧至少一个表达式为真,结果为真,否则为假)。
4.1 逻辑取反运算符 !
| 非0 | 0 |
| 0 | 1 |
示例:当flag为假时执行操作
#include <stdio.h>
int main()
{
int flag = 0;
if(!flag) // flag为0(假),!flag为1(真),执行语句
{
printf("do something\\n");
}
return 0;
}
4.2 逻辑与运算符 &&
| 非0 | 非0 | 1 |
| 非0 | 0 | 0 |
| 0 | 非0 | 0 |
| 0 | 0 | 0 |
示例:判断月份是否为3~5月(春季)
int month = 0;
scanf("%d", &month);
if(month >= 3 && month <= 5) // 同时满足两个条件才为真
{
printf("春季\\n");
}
4.3 逻辑或运算符 ||
| 非0 | 非0 | 1 |
| 非0 | 0 | 1 |
| 0 | 非0 | 1 |
| 0 | 0 | 0 |
示例:判断月份是否为12、1、2月(冬季)
int month = 0;
scanf("%d", &month);
if(month == 12 || month == 1 || month == 2) // 满足任一条件即为真
{
printf("冬季\\n");
}
4.4 练习:闰年的判断
闰年规则:
代码1:
#include <stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if(year % 4 == 0 && year % 100 != 0)
printf("是闰年\\n");
else if(year % 400 == 0)
printf("是闰年\\n");
return 0;
}
代码2(合并条件):
#include <stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
printf("是闰年\\n");
return 0;
}
4.5 短路求值
逻辑运算符的特点:先对左侧表达式求值,再对右侧求值。若左侧表达式已能确定整个表达式的结果,右侧表达式不再求值,称为“短路”。
练习1:分析代码输出结果
#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);
return 0;
}
- 输出:a=1, b=2, c=3, d=4
- 原因:a++为0(假),&& 短路,右侧++b和d++未执行。
若a=1,则:
- 输出:a=2, b=3, c=3, d=5
- 原因:a++为1(真),执行++b(b=3),再执行d++(d=5),整个表达式为真。
练习2:分析代码输出结果
#include <stdio.h>
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);
return 0;
}
- 输出:a=2, b=2, c=3, d=4
- 原因:a++为1(真),|| 短路,右侧++b和d++未执行。
若a=0,则:
- 输出:a=1, b=3, c=3, d=4
- 原因:a++为0(假),执行++b(b=3,真),|| 短路,d++未执行。
5. switch语句
switch语句是特殊形式的if…else结构,适用于条件有多个结果的场景,使代码更易用、可读性更高。
5.1 语法形式
switch (expression)
{
case value1: statement;
case value2: statement;
...
default: statement;
}
- expression:必须是整型表达式;
- case后的值:必须是整型常量表达式;
- 功能:根据expression的值,执行对应case分支;无匹配值时,执行default分支。
5.2 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;
}
注意事项:
5.3 switch语句中的break
break的作用是跳出switch语句,避免贯穿效应。
示例(无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(7%3=1),输出:
余数是1
余数是2
原因:无break,执行case 1后继续执行case 2。
5.4 switch语句中的default
default用于处理无匹配case的情况。
示例:输入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;
}
5.5 switch语句中case和default的顺序
case和default无固定顺序,可根据需求调整,但通常将default放在最后。
6. while循环
while是C语言三种循环语句之一,语法结构与if语句相似。
6.1 if 和 while的对比
// if语句:条件满足,执行一次
if(表达式)
语句;
// while循环:条件满足,重复执行
while(表达式)
语句; // 循环体需包含多条语句时,用{}括起
示例代码1(if语句):
#include <stdio.h>
int main()
{
if(1)
printf("hehe\\n"); // 打印一次hehe
return 0;
}
示例代码2(while循环):
#include <stdio.h>
int main()
{
while(1)
printf("hehe\\n"); // 死循环打印hehe
return 0;
}
6.2 while语句的执行流程

6.3 while循环的实践
练习:在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
int i = 1;
while(i <= 10)
{
printf("%d ", i);
i = i + 1; // 循环变量调整
}
return 0;
}
运行结果:1 2 3 4 5 6 7 8 9 10
6.4 练习:逆序打印整数的每一位
题目:输入一个正整数,逆序打印其每一位(如输入1234,输出4 3 2 1)
题目解析:
参考代码:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while(n) // n != 0时循环
{
printf("%d ", n % 10); // 打印最低位
n /= 10; // 去掉最低位
}
return 0;
}
7. for循环
for循环是三种循环中使用最多的,语法简洁,维护性强。
7.1 语法形式
for(表达式1; 表达式2; 表达式3)
语句; // 循环体需包含多条语句时,用{}括起
- 表达式1:循环变量的初始化(仅执行1次);
- 表达式2:循环结束条件的判断;
- 表达式3:循环变量的调整。
7.2 for循环的执行流程

7.3 for循环的实践
练习:在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
int i = 0;
for(i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
运行结果:1 2 3 4 5 6 7 8 9 10
7.4 while循环和for循环的对比
| 结构分布 | 初始化、判断、调整分散 | 初始化、判断、调整集中 |
| 维护性 | 较差(代码多时易混乱) | 较好(结构清晰) |
while循环实现打印1~10:
#include <stdio.h>
int main()
{
int i = 1; // 初始化
while (i <= 10) // 判断
{
printf("%d ", i);
i = i + 1; // 调整
}
return 0;
}
for循环实现打印1~10:
#include <stdio.h>
int main()
{
int i = 0;
for(i = 1; i <= 10; i++) // 初始化、判断、调整集中
{
printf("%d ", i);
}
return 0;
}
7.5 练习:计算1~100之间3的倍数的和
参考代码1:
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
for(i = 1; i <= 100; i++)
{
if(i % 3 == 0)
sum += i;
}
printf("%d\\n", sum);
return 0;
}
参考代码2(优化):直接生成3的倍数,减少循环次数
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
for(i = 3; i <= 100; i += 3) // 每次加3,直接生成3的倍数
{
sum += i;
}
printf("%d\\n", sum);
return 0;
}
8. do-while循环
do-while循环使用最少,特点是循环体至少执行一次。
8.1 语法形式
do
语句; // 循环体
while(表达式);
- while和for循环:先判断条件,再执行循环体;
- do-while循环:先执行循环体,再判断条件。
8.2 do-while循环的执行流程

8.3 do-while循环的实例
练习:在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i = i + 1; // 循环变量调整
} while(i <= 10);
return 0;
}
运行结果:1 2 3 4 5 6 7 8 9 10
8.4 练习:计算整数的位数
题目:输入一个正整数,计算其位数(如输入1234,输出4)
参考代码:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int cnt = 0;
do
{
cnt++; // 统计位数
n = n / 10; // 去掉最低位
} while (n); // n != 0时循环
printf("%d\\n", cnt);
return 0;
}
说明:即使输入n=0,do-while循环也会执行一次,正确统计0的位数(1位)。
9. break和continue语句
break和continue是用于控制循环流程的关键字,功能不同。
9.1 break的作用
执行break后,直接跳出当前所在的循环,继续往后执行。
9.1.1 while循环中的break
#include <stdio.h>
int main()
{
int i = 1;
while(i <= 10)
{
if(i == 5)
break; // i=5时,终止循环
printf("%d ", i);
i = i + 1;
}
return 0;
}
运行结果:1 2 3 4
9.1.2 for循环中的break
#include <stdio.h>
int main()
{
int i = 1;
for(i = 1; i <= 10; i++)
{
if(i == 5)
break; // i=5时,终止循环
printf("%d ", i);
}
return 0;
}
运行结果:1 2 3 4
9.1.3 do-while循环中的break
#include <stdio.h>
int main()
{
int i = 1;
do
{
if(i == 5)
break;
printf("%d ", i);
i = i + 1;
} while(i <= 10);
return 0;
}
运行结果:1 2 3 4
9.2 continue的作用
跳过本次循环中continue后边的代码,直接进入下一次循环判断。
9.2.1 while循环中的continue
#include <stdio.h>
int main()
{
int i = 1;
while(i <= 10)
{
if(i == 5)
continue; // 跳过后续代码,进入下一次判断
printf("%d ", i);
i = i + 1; // 注意:i=5时,此语句被跳过,导致死循环
}
return 0;
}
运行结果:1 2 3 4(之后死循环)
9.2.2 for循环中的continue
#include <stdio.h>
int main()
{
int i = 1;
for(i = 1; i <= 10; i++)
{
if(i == 5)
continue; // 跳过后续代码,进入i++调整
printf("%d ", i);
}
return 0;
}
运行结果:1 2 3 4 6 7 8 9 10
9.2.3 do-while循环中的continue
#include <stdio.h>
int main()
{
int i = 1;
do
{
if(i == 5)
{
i = i + 1; // 避免死循环,手动调整i
continue;
}
printf("%d ", i);
i = i + 1;
} while(i <= 10);
return 0;
}
运行结果:1 2 3 4 6 7 8 9 10
10. 循环的嵌套
三种循环(while、do while、for)可相互嵌套,解决复杂问题。
练习:找出100~200之间的素数并打印
素数定义:只能被1和本身整除的数字。
题目解析:
参考代码:
#include <stdio.h>
int main()
{
int i = 0;
// 外层循环:产生100~200的数字
for(i = 100; i <= 200; i++)
{
int j = 0;
int flag = 1; // 假设i是素数
// 内层循环:判断i是否为素数
for(j = 2; j < i; j++)
{
if(i % j == 0)
{
flag = 0; // 不是素数,修改flag
break; // 跳出内层循环
}
}
if(flag == 1)
printf("%d ", i); // 打印素数
}
return 0;
}
11. goto语句
goto语句可在同一个函数内跳转到指定好的标号处。
11.1 语法形式
goto 标号;
// …
标号: 语句;
11.2 基本用法
#include <stdio.h>
int main()
{
printf("hehe\\n");
goto next;
printf("haha\\n"); // 被跳过,不执行
next:
printf("跳过了haha的打印\\n");
return 0;
}
运行结果:
hehe
跳过了haha的打印
11.3 多层循环中快速跳出
goto语句如果使用不当,会导致函数内部随意乱跳转,打乱程序流程,所有建议尽量避免使用。但是,goto在多层循环中可快速跳出所有循环,比break更方便:
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error; // 直接跳转到error标号处
}
}
}
error:
// 后续处理代码



![P11246 [GESP202409 六级] 小杨和整数拆分-171主机测评](https://www.171host.com/wp-content/uploads/2026/11/20261108100631-6af049a75855c-220x150.png)

