C语言 分支结构(1)
分支结构
条件判断:根据某个条件成立于否,决定是否执行指定的操作。
条件判断的结果是逻辑值。其结果为真(写代码的时候可以用 非0 ,C语言给我们返回使用 1)或者为 假(0)。
面试题:
① 条件表达式(作为分支或者循环条件的表达式称之为条件表达式)支持任意类型的表达式 ,包括如关系、逻辑、赋值、算数等表达式、但实际上有意义的表达式只有关系表达式和逻辑表达式。② C语言中、条件表达式的结果是逻辑值,使用非0表示真、使用0表示假,但是底层使用1和0来表式真假。
关系运算符及其表达式
问题抛出
关系运算符及其优先级次序
关系运算符式用来进行比较的符号。C语言提供了6种关系运算符:
int a = 5, b = 6;
printf("%d\n", a > 5 != b > 5);// 1 解释:a > 5的结果和 b > 5的结果进行比较

逻辑运算符及其表达式
问题抛出
如下表达式:
其中的条件需要用到逻辑表达式来表示:x != 0 && a != 0 就是一种逻辑表达式。
逻辑运算符及其优先级
逻辑运算符式构成复杂的复合条件的运算符:
定义:用逻辑运算符将关系表达式或者逻辑表达式链接起来构成有意义的算式称作逻辑表达式。
用if语句实现分支结构
单分支:if...
语法:
if(条件表达式)
{语句;
}//如果是单语句,可以省略{},如下:
if(条件表达式) 语句;if(条件表达式)语句;
流程图:
面试题:
if(条件表达式) 语句1;语句2; 请选择于上面代码完全一致的写法(A) A. if(条件表达式){语句1;} 语句2; B. if (条件表达式){语句1;语句2;}
代码:
#include<stdio.h>int main()
{//定义x,y;int x,y = -2;//控制台输入;printf("请输入一个整数:\n");scanf("%d",&x);//判断语句if(x>= 0) y = 2;//输出printf("x=%d,y=%d\n",x,y);return 0;}
结果:
案例:
需求:有a,b,c 三个数,要求从控制台输入,并求出其中的最大数和最小数。
#include<stdio.h>
#include<stdlib.h> int main()
{int a, b, c;int max_num,min_num;printf("请输入三个整数(用逗号分隔,如:1,2,3):\n");// 循环读取,直到输入格式正确(成功读取3个整数)while (1){if (scanf("%d,%d,%d", &a, &b, &c) == 3){break; // 输入正确,退出循环}else{printf("格式错误,请重新输入(用逗号分隔三个整数):\n");// 清空输入缓冲区,避免错误数据残留导致无限循环while (getchar() != '\n'); // 读取并丢弃缓冲区直到换行符}}printf("您输入的整数为:%d,%d,%d\n", a, b, c);//采用逐步算法//最大数max_num = a;if(b > max_num) max_num = b;if(c > max_num) max_num = c;printf("最大数为:%d\n",max_num);//最小数min_num = a;if(b < min_num) min_num = b;if(c < max_num) min_num = c;printf("最数为:%d\n",min_num);return 0;
}
结果:
总结:
- 最大数判断:通过先假设
a
为最大数,再依次与b
、c
比较并更新,确保最终结果是三个数中的最大值; - 最小数判断:同理,先假设
a
为最小数,再依次与b
、c
比较并更新,逻辑清晰且无漏洞; - 避免了原代码中 “多分支判断不完整” 和 “重复输出” 的问题,适用于所有整数(包括正数、负数、重复数)
有可能产生的问题
在变量赋值前使用变量、导致运算结果错误,因为变量未赋值前,系统会给变量分配随机值。
小贴士:建议的书写规范:if(flag == 1) 建议写成:if(flag)if(flag == 0) 建议写成:if(!flag)
双分支:if...else...
语法:
if(条件表达式)
{语句1;
}
else
{语句2;
}//如果是单语句,可以省略{},以下两种写法等价
if(条件表达式) 语句1;
else 语句2;if(条件表达式)语句1;
else语句2;
注意:else语句本身不能单独存在,必须和距离自己最近的未配对的if配对。
流程图
功能:
若表达式值为1,则执行语句1;否则执行表达式2。不管条件表达式成立步成立,都要执行一个语句,其次需要注意的是,语句1和语句2都可以是单语句或者复合语句。
说明:
if..else..结构可以实现双分支选择结构。C语言允许if..else..结构嵌套。即在语句1与语 句2中又可以包含完整的if语句或者if..else..语句,并且这种嵌套可以多层(为了保证程序的执行效率,建议不超过3~4层)。利用if..else..结构的嵌套,可以实现多分支结构。
案例:
需求:计算并输出下列分段函数的值:
流程图:
代码:
#include<stdio.h>
int main()
{int x;printf("输入一个整数:");while(1){if(scanf("%d",&x) == 1){break;}else{ printf("格式错误,请重新输入一个整数");}//清除缓冲区while(getchar() != '\n');}if(x < 0){printf("x=%d,y=-2\n",x);}else{printf("x=%d,y=2\n",x);}return 0;
}
结果:
案例:
需求:通过控制台,输入一个年份,判断这个年份是闰年还是平年
分析:
判断条件:(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
代码:
#include<stdio.h>
int main()
{// 定义天干(10个):索引0对应癸,1对应甲,...,9对应壬(配合公式取余)const char* tianGan[] = {"癸", "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬"};// 定义地支(12个):索引0对应亥,1对应子,...,11对应戌const char* diZhi[] = {"亥", "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌"};// 地支对应生肖(与地支索引一一对应)const char* shengXiao[] = {"猪", "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗"};//定义一个年份int year;//控制台输入printf("输入一个年份(xxxx):");//循环输入,防止输错while(1){if(scanf("%d",&year) == 1){break;}else{printf("请重新输入:");}//清除缓冲区while(getchar() != '\n');}if((year % 4 == 0 && year % 100) != 0 || year % 400 == 0)printf("%d年是闰年!\n",year);elseprintf("%d年是平年!\n",year);printf("打印变量的内存首地址:%p\n",&year);// 计算天干、地支索引(公式:(年份-3)取余,修正公元年与干支年的偏移)int tgIndex = (year - 3) % 10;int dzIndex = (year - 3) % 12;// 处理负数取余的情况(确保索引为非负)if (tgIndex < 0) tgIndex += 10;if (dzIndex < 0) dzIndex += 12;// 输出结果printf("%d年对应的干支纪年为:%s%s年\n", year, tianGan[tgIndex], diZhi[dzIndex]);printf("生肖为:%s\n", shengXiao[dzIndex]);return 0;}
结果:
注意:对于单语句的双分支,我们可以使用三目运算符的写法及逆行简化!
双分支:三目运算符
三目运算符,又称作三元运算符。
语法:
表达式1 ? 表达式2 : 表达式3;
说明:
#include <stdio.h>
int main()
{// 创建两个变量int x, y;
// 控制台输入printf("请输入一个整数:\n");scanf("%d", &x);//判断y = x < 0 ? -2 : 2;// 打印输出printf("x=%d,y=%d\n",x,y);
}
代码:
#include<stdio.h>
int main()
{//定义一个数int a,b,c;int max_num,min_num;//控制台输入printf("请输入三个整数:");while(1){if(scanf("%d%d%d",&a,&b,&c) == 3)break;elseprintf("输入错误,请从新输入");while(getchar() != '\n');}//验证输入的数字printf("a=%d,b=%d,c=%d\n",a,b,c);//最大值max_num = a;max_num = b>max_num ? b:max_num;max_num = c>max_num ? c:max_num;min_num = a;min_num = b<min_num ? b:min_num;min_num = c<min_num ? c:min_num;printf("最大值=%d,最小值=%d",max_num,min_num);return 0;}
结果:
#include<stdio.h>
int main()
{//创建一个数int i;//控制台输入printf("输入一个整数:");while(1){if(scanf("%d",&i) == 1)break;elseprintf("输入错误,请重新输入!\n");//清除缓存区while(getchar() != '\n');}printf("(1)\n");//单分支语句if(i%2 == 0) printf("%d为偶数\n",i);if(i%2 != 0) printf("%d为奇数\n",i);printf("(2)\n");//另一种单分支语句写法,等价于if(i%2 == 0){printf("%d为偶数\n",i); } if(i%2 != 0){printf("%d为奇数\n",i); }printf("(3)\n");//多分支语句if(i%2 == 0) {printf("%d为偶数\n",i); }else{printf("%d为奇数\n",i);}printf("(4)\n");//多分支语句的另一种写法if(i%2 == 0) printf("%d为偶数\n",i); elseprintf("%d为奇数\n",i);printf("(5)\n");//三目运算符i % 2 == 0 ? printf("%d为偶数\n",i) : printf("%d为奇数\n",i);return 0;}