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


优化后:

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

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

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

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

或运算符(||):

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

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

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

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

分析过程:


while中条件表达式执行次数比循环体多一次,当不满足条件,条件语句执行,循环体不执行
解决了初始化变量、条件、调整变量分开的问题,便于控制 举例:0-100中3的倍数之和


打印1~10:

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


这里用do-while合适,当n=0时至少有一位(更全面)
break直接跳出循环 continue跳过本次循环continue后面的代码,直接去判断条件,看是否进行下一次循环

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

continue在while和for循环的区别


题目:

解析:

#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语句只能在同一个函数内部使用 使用场景:

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

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

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

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

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

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

do-while可以解决这个问题,因为游戏运行起来就要打印菜单,用do-while合适
#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的穿透现象、循环中的break与continue区别、以及随机数的生成方式有了更深刻的理解。 编程之路,避坑即进步。希望你能在今后的编码实践中,时刻警惕这些常见的陷阱,写出更加健壮、清晰的代码。如果你在实战中遇到了其他流程控制相关的问题,欢迎在评论区留言交流,我们一起探讨,共同成长!