欢迎大家来到贝蒂大讲堂

养成好习惯,先赞后看哦~

所属专栏:C语言学习

贝蒂的主页:Betty‘s blog

引言

C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构。为什么有着三种结构呢,大家其实可以想象一下,生活中的绝大数事情都可以抽象着三种结构,而我们今天要给大家介绍的就是三大结构之一——选择结构

选择结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。它的流程图大致如下:

1. 逻辑运算符

在讲解什么是选择结构前,我们要先了解一些C语言常见的逻辑运算符。

1.1 逻辑取反运算符

逻辑取反运算符的形式特别简单,只需要在需要进行取反操作的变量前+!:

!(变量名)

假设有变量a,它的取反规则如下:

a !a

1.2 与运算符

在C语言中,并不支持数学上的且,而是由一个运算符&&代替的。比如说数学上的0<x<10写成C语言的形式就是x>0&&x<10。

假设有两个变量a,b,与运算符的运算规则如下:

a b a&&b

1.3 或运算符

在C语言中,或者也有专门的运算符表示——||

假设有两个变量a,b,或运算符的运算规则如下:

a b a||b

2. if......else语句

2.1 if语句

if语句是最简单选择结构语法之一,他的语法结构如下:

if ( 表达式 )

语句

表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏。

C语言特别规定:非零为真,零为假。

例⼦:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数

#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
printf("%d 是奇数\n", num);
return 0;
}
  • 首先输入一个值(num),然后进入if语句判断,如果num%2等于1,条件就为真,就会打印;反之,条件为假,就不会进入打印。

  • 特别注意:C语言中判断是否相等的运算符是==,=是赋值符号。

2.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;
}
  • 默认在 if 和 else 语句中默认都只控制⼀条语句

2.3 多个if else的使用

if else 语句也可以多个同时使用,构成多个分支,形式如下:

if(判断条件1){

语句块1

} else if(判断条件2){

语句块2

}else if(判断条件3){

语句块3

}else if(判断条件m){

语句块m

}else{

语句块n

}

意思是,从上到下依次检测判断条件,当某个判断条件成立时,则执行其对应的语句块,然后跳到整个 if else 语句之外继续执行其他代码。如果所有判断条件都不成立,则执行语句块n,然后继续执行后续代码。

也就是说,一旦遇到能够成立的判断条件,则不再执行其他的语句块,所以最终只能有一个语句块被执行。

我们以下面这段代码举个例子:

#include<stdio.h>

int main()
{
int age = 0;
scanf("%d", &age);
if (age > 0 && age < 18) {
printf("少年\n");
}
else if (age >= 18 && age < 30) {
printf("青年\n");
}
else if (age >= 30 && age < 45) {
printf("壮年\n");
}
else if (age >= 45 && age < 55) {
printf("中年\n");
}
else if (age >= 55 && age < 75) {
printf("老年\n");
}
else {
printf("老寿星\n");
}
return 0;
}

假设我们输入的是40,输出:

2.4 if else的嵌套

if else也能嵌套使用,也就是说if执行的语句中也可以包含if else语句。我们用判断三角形来具体说明这个问题:

#include <stdio.h>
int main()
{
int a, b, c;
while(scanf("%d%d%d", &a, &b, &c)==3)
{
if (a + b > c && a + c > b && b + c > a) {
if (a == b && b == c) {
printf("是一个等边三角形");
}
else if (a == b || a == c || b == c) {
printf("是一个等腰三角形");
}
else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) {
printf("是一个直角三角形");
}
else {
printf("是一个普通三角形");
}
}
else {
printf("由%d,%d,%d三边组成的不是三角形", a, b, c);
}
}
return 0;
}

2.5 悬空的else

在书写if....else语句时最好每一条语句后面都加上大括号

至于为什么,我们可以以下面这段代码举例

#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;
}//输出什么???

输出结果:

为什么会什么结果都没有输出呢?

这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。最下面的else其实是与if(b==2)这条语句配对的,而不是与if(a==1)配对,当a等于0,自然不会进入任何语句。

3. switch语句

在我们学习多个lf else语句时候就会会发现,如果条件多的话,整个选择结构就会变得很冗杂,所以C语言为了解决这个问题引入了switch,switch 是另外一种选择结构的语句,用来代替简单的、拥有多个分支的 if else 语句。

比如说下面这段代码就会显得十分冗余

int main()
{
int day = 0;
scanf("%d", day);
if(day == 1)
printf("星期一\n");
else if(day == 2)
printf("星期二\n");
else if (day == 3)
printf("星期三\n");
else if (day == 4)
printf("星期四\n");
else if (day == 5)
printf("星期五\n");
else if (day == 6)
printf("星期六\n");
else
printf("星期天\n");
return 0;
}

3.1 switch的基本规则

switch的语法如下:

switch (expression) {

case value1: statement

case value2: statement

default: statement

}

switch语句必须遵循下面的规则:

  1. switch语句中的括号是一个常量表达式,必须是一个整型或枚举类型。

  2. 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。

3.2 break的重要性

学习完switch的语法之后,然后我们可以将最开始的例子改造

int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
case 2:
printf("星期二\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
case 5:
printf("星期五\n");
case 6:
printf("星期六\n");
case 7:
printf("星期天\n");
}
return 0;
}

但是当我们一运行代码就会发现问题:

为什么输入1反而后续的结果都输出了呢?

原因是 switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏,有可能执⾏其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束。

所以在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。

当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。

改造代码后;

int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}

3.3 default的使用

在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊default ⼦句。

其语法如下:

switch (expression) {

case value1: statement

case value2: statement

default: statement

}

  • switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执⾏default ⼦句。

就⽐如前⾯做的打印星期的练习,如果 day 的输⼊不是1~7的值,如果我们要提⽰:输⼊错误,则可以这样完成代码:

#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
default :
printf("输入错误\n");
break;
}
return 0;
}
  • 在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实际需求的就可以。不过我们通常是把 default ⼦句放在最后处理的。

4. 综合练习

4.1 题目一

输入三个整数x,y,z,请把这三个数由小到大输出。

#include <stdio.h>
int main()
{
int x, y, z, t;
printf("请输入三个数字:\n");
scanf("%d%d%d", &x, &y, &z);
if (x > y)
{ /*交换x,y的值*/
t = x; x = y; y = t;
}
if (x > z)
{ /*交换x,z的值*/
t = z; z = x; x = t;
}
if (y > z)
{ /*交换z,y的值*/
t = y; y = z; z = t;
}
printf("从小到大排序: %d %d %d\n", x, y, z);
return 0;
}

4.2 题目二

输入某年某月某日,判断这一天是这一年的第几天?

#include <stdio.h>
int main()
{
int day, month, year, sum, leap;
printf("请输入年、月、日,格式为:年,月,日(2015,12,10)\n");
scanf("%d,%d,%d", &year, &month, &day); // 格式为:2015,12,10
switch (month) // 先计算某月以前月份的总天数
{
case 1:
sum = 0;
break;
case 2:
sum = 31;
break;
case 3:
sum = 59;
break;
case 4:
sum = 90;
break;
case 5:
sum = 120;
break;
case 6:
sum = 151;
break;
case 7:
sum = 181;
break;
case 8:
sum = 212;
break;
case 9:
sum = 243;
break;
case 10:
sum = 273;
break;
case 11:
sum = 304;
break;
case 12:
sum = 334;
break;
default:
printf("输入错误\n");
break;
}
sum = sum + day; // 再加上某天的天数
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {// 判断是不是闰年
leap = 1;
}
else {
leap = 0;
}
if (leap == 1 && month > 2)
{ // *如果是闰年且月份大于2,总天数应该加一天
sum++;
}
printf("这是这一年的第 %d 天。", sum);
printf("\n");
return 0;
}

解密C语言选择结构:掌握条件语句与分支逻辑的利器的更多相关文章

  1. Java语法基础(三)----选择结构的if语句、switch语句

    [前言] 流程控制语句: 在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的.也就是说程序的流程对运行结果有直接的影响.所以,我们必须清楚每条语句的执行流程.而且,很多时候我们要通过 ...

  2. C语言------选择结构

    仅供借鉴.仅供借鉴.仅供借鉴(整理了一下大一C语言每个章节的练习题.没得题目.只有程序了) 文章目录 1 .实训名称 2 .实训目的及要求 3 .源代码及运行截图 4.小结 1 .实训名称 实训4:选 ...

  3. C语言---选择结构和循环结构

    C语言的两种选择语句,1) if语句; 2) switch语句; 在if判断语句中,一般使用关系表达式. 关系运算符: <.<=.>.>=.==.!= 关系表达式:用关系运算符 ...

  4. C语言----选择结构(基础篇三)

    大家好,忙里抽空更新一下自己的博客,算是自己的一个进步,C语言视频启蒙我早就看完啦,只是觉得这个视频真不错,所以给大家分享一下,同时自己还有很多没有理解透彻,写写博客算是一个笔记更是对自己所学的知识的 ...

  5. Python语言学习前提:条件语句

    一.条件语句 1.条件语句:通过一条或多条语句的执行结果(True或False)来决定执行额代码块.python程序语言指定任何非0或非空(null)的值为true,0或null为false. 2. ...

  6. C#语言————选择结构

    int[] num = new int[] {23,76,54,87,51,12 }; //冒泡排序 for (int i = 0; i < num.Length - 1; i++) { for ...

  7. 选择结构-扩展if-else语句和练习用if语句实现考试成绩划分

    判断语句3--if..else if...else if语句第三种格式: if...else if ...else if (判断条件1) { 执行语句1; } else if (判断条件2) { 执行 ...

  8. 选择结构-单if语句和标准if else语句

    判断语句1--if if语句第一种格式: if if(关系表达式){ 语句体; } 执行流程 首先判断关系表达式看其结果是true还是false 如果是true就执行语句体 如果是false就不执行语 ...

  9. 『无为则无心』Python基础 — 13、Python流程控制语句(条件语句)

    目录 1.流程控制基本概念 2.选择结构(条件语句) (1)条件语句概念 (2)if语句语法 (3)if...else...语句 (4)多重判断 (5)if语句嵌套 3.应用:猜拳游戏 4.三元运算符 ...

  10. (旧)子数涵数·C语言——条件语句

    首先,我们讲一下理论知识,在编程中有三种结构,分别是顺序结构.条件结构.循环结构,如果用流程图来表示的话就是: 那么在C语言中,如何灵活运用这三种结构呢?这就需要用到控制语句了. 而条件语句便是控制语 ...

随机推荐

  1. [转帖]Linux 性能监控 Sar (Sysstat) 示例

    https://bbs.huaweicloud.com/blogs/345343#   [摘要] 使用 sar,您可以实时监控各种 Linux 子系统(CPU.内存.I/O..)的性能,还可以持续收集 ...

  2. OB指定开源版本MySQL模式单节点安装

    OB指定开源版本MySQL模式单节点安装 yum源处理 yum install -y yum-utils yum-config-manager --add-repo https://mirrors.a ...

  3. [转帖]AF_UNIX和AF_INET

    https://www.cnblogs.com/shangerzhong/p/9153737.html family参数代表地址家族,比较常用的为AF_INET或AF_UNIX.AF_UNIX用于同一 ...

  4. [转帖]12.24.2 DECIMAL Data Type Characteristics

    https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html This section discusses the characteri ...

  5. [转帖]VMware Workstation PRO 17.0.2正式版+激活密钥

    https://www.isharepc.com/36181.html VMware Workstation PRO 17是一个简化的桌面虚拟化应用程序. 它在同一台计算机上运行一个或多个操作系统而无 ...

  6. [转帖]Docker:Python环境Docker镜像瘦身

    https://www.jianshu.com/p/c0ad13e0be85 关键字:Docker,Python 原始镜像 封装一个Python 3.7的环境并且安装Python依赖包实现一个机器学习 ...

  7. 【转帖】16.JVM栈帧内部结构-局部变量表

    目录 1.局部变量表(Local variables) 1.局部变量表(Local variables) 1.局部变量表也称为局部变量数组或本地变量表. 2.局部变量表定义为一个数字数组,主要用于存储 ...

  8. [转帖]springboot中使用skywalking实现日志追踪

    文章目录 SkyWalking分布式追踪系统 介绍 主要架构 环境 引入依赖 配置Log4j2 下载编译好的8.7.0版本包 使用探针实现日志追踪 启动脚本 启动Java服务 访问服务 使用UI 切换 ...

  9. [转帖]开源软件项目中BSD、MIT许可证合规问题探析

    https://www.allbrightlaw.com/CN/10475/3be2369275d19e9e.aspx   [摘要]本文将探析BSD开源许可证(Berkeley Software Di ...

  10. HTTPD 搭建正向代理 使无网络访问权限的服务器能够访问互联网服务的快捷办法

    背景 公司有保密要求比较高,数据安全要求比较高的企业客户,要求核心业务服务器部允许直接访问互联网,但是因为我们有一些OCR识别以及发票查验等的场景需要连接云端的服务才可以正常使用, 所以这里面就存在安 ...