首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【避坑指南】C语言流程控制中常见的5大错误,你中招了几个?

【避坑指南】C语言流程控制中常见的5大错误,你中招了几个?

作者头像
码途随笔
发布2026-01-12 19:56:35
发布2026-01-12 19:56:35
1250
举报

前言

在C语言的学习与开发过程中,流程控制是我们编写逻辑清晰、结构合理的代码不可或缺的一部分。无论是条件判断、循环结构,还是跳转语句,每一个细节都可能影响程序的正确性与效率。然而,即使是经验丰富的开发者,也难免在流程控制中踩坑。你是否曾在悬空else中迷失方向?是否因switch忘记写break而调试到深夜?又是否对continuewhilefor中的行为差异感到困惑? 本文将为你系统梳理C语言流程控制中常见的5大错误,并附上详细的解析与代码示例,帮助你从“知其然”到“知其所以然”。无论你是初学者,还是希望巩固基础的进阶者,这篇文章都将是你代码路上的“避坑指南”

一、if与else

if、else都可以是双分支 if与else可以相互嵌套,完成更复杂的功能(看重里面的逻辑,比如age<=44就行了,已经大于18了)

优化后:

悬空else: else总是与最近的if匹配(注重代码风格)

二、if语句中的操作符

2.1 关系操作符

用该操作符的表达式称为关系表达式,关系表达式的结果为0/1,表示真假,C语言中0表示假,非零表示真 防止关系操作符==与赋值操作符=混淆,可以把常量放在左边,代码风格,(如果写错会报错) 多个关系运算符不宜连用(用逻辑与或逻辑或) 字符串比较用strcmp(),cmp——compare的缩写,规则:一个一个字符比较,出现不一样的字符,比较对应的ASCii值比较,此时它们的大小就是字符串的大小

2.2 条件操作符

三目操作符不能写的太复杂 ,避免看不懂

2.3 逻辑操作符(结果只有0或1)

逻辑取反操作符( ! ) 适用场景:当条件为假,才执行

与运算符( && ): 适用场景:

或运算符(||):

2.4 短路求值:

逻辑操作符根据左操作数的结果就能知道整个表达式的结果,不再计算右操作数,称为短路求值。

三、switch语句

switch中expression必须是整形表达式,value是整形常量表达式 case决定了入口,不能决定出口(要加break) case后面与数字间要加空格,按需求,不是每个都需要break

顺序问题(可以任意放,但是不能影响代码逻辑):

四、while循环

while与if语句一样,不同在于循环 例子:

分析过程:

while中条件表达式执行次数比循环体多一次,当不满足条件,条件语句执行,循环体不执行

五、for循环

解决了初始化变量、条件、调整变量分开的问题,便于控制 举例:0-100中3的倍数之和

六、do-while循环

打印1~10:

特点:至少循环一次 使用场景:

这里用do-while合适,当n=0时至少有一位(更全面)

七、break与continue

break直接跳出循环 continue跳过本次循环continue后面的代码,直接去判断条件,看是否进行下一次循环

这道题要细心,不然容易错 结果是:

continue在while和for循环的区别

八、循环的嵌套

题目:

解析:

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int count = 0;
	for (int i = 100; i <= 200; i++)
	{
		int flag = 1;
		for (int j = 2; j <= i - 1; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
		{
			printf("\n%d ", i);
			count++;
		}
	}
	printf("%d ", count);
}

九、goto语句

goto语句由goto语句和跳转标号组成,注意:goto语句只能在同一个函数内部使用 使用场景:

十、猜数字游戏

学会前面的知识,可以写一些有趣的代码

难点: 随机数的生成 猜数字的过程用循环实现 程序不退出,直接进行下一次游戏

10.1 随机数

但是每次运行,生成的结果是一样的,并且是伪随机数(由算法生成的),rand函数是对一个叫“种子”的基准值进行运算生成随机数,之所以之前生成的随机数是一样的,因为默认种子是“1”,要每一次生成不同的随机数,必须要让种子变化。 可以通过srand来设置rand函数的种子

但是种子是随机数,随机数也是也需要种子,生成随机数需要随机数,这就矛盾了其实srand()的参数只要是变化的就行了,并不要求一定是随机数 time函数可以做到这一点

由于time函数返回time_t类型(也是整形),但是编译器会报警告,需要强行转化成(unsigned int) 类型

由于随机数范围太大,所以需要设置范围

10.2 程序不退出,直接进行下一次游戏

do-while可以解决这个问题,因为游戏运行起来就要打印菜单,用do-while合适

10.3 总代码

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("********************\n");
	printf("*****1. play********\n");
	printf("*****0. exit********\n");
}
void game()
{
	int ret = rand()%100+1;
	int guess;
	int count = 5;
	while (count)
	{
		printf("还剩%d次机会\n",count);
		printf("请输入要猜的数字\n");
		scanf("%d", &guess);
		if (guess < ret)
		{
			printf("猜小了\n");
		}
		else if (guess > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
		count--;
	}
	if (count == 0)
	{
		printf("机会已用完,挑战失败,随机数是=%d\n",ret);
	}
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请输入:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("成功退出\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

结语

流程控制是C语言编程的骨架,理解并正确使用它,是写出高质量代码的第一步。通过本文的学习,相信你已经对if-else的匹配规则、switch的穿透现象、循环中的breakcontinue区别、以及随机数的生成方式有了更深刻的理解。 编程之路,避坑即进步。希望你能在今后的编码实践中,时刻警惕这些常见的陷阱,写出更加健壮、清晰的代码。如果你在实战中遇到了其他流程控制相关的问题,欢迎在评论区留言交流,我们一起探讨,共同成长!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、if与else
  • 二、if语句中的操作符
    • 2.1 关系操作符
    • 2.2 条件操作符
    • 2.3 逻辑操作符(结果只有0或1)
    • 2.4 短路求值:
  • 三、switch语句
  • 四、while循环
  • 五、for循环
  • 六、do-while循环
  • 七、break与continue
  • 八、循环的嵌套
  • 九、goto语句
  • 十、猜数字游戏
    • 10.1 随机数
    • 10.2 程序不退出,直接进行下一次游戏
    • 10.3 总代码
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档