[C语言]——分支和循环(1)

目录

一.if语句

1.if

2.else

3.分支中包含多条语句

4.嵌套if

5.悬空else问题

二.关系操作符

三.条件操作符


C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分为这三种结构或者这三种结构的组合。
我们可以 使用if 、 switch 实现分支结构,使用 for 、 while 、 do while 实现循环结构

一.if语句

1.if

if 语句的语法形式如下:
if ( 表达式 )语句
  • 表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行
  • 在C语言中,0为假,非0表示真,也就是表达式的结果如果是0,则语句不执行,表达式的结果如果是不是0,则语句执行。
例⼦:输⼊⼀个整数,判断是否为奇数:
#include <stdio.h>
int main()
{int num = 0;scanf("%d", &num);if(num % 2 == 1)printf("%d 是奇数\n", num);return 0;
}

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);elseprintf("%d 是偶数\n", num);return 0;
}
练习:输⼊⼀个年龄,>= 18岁就输出:成年,否则就输出:未成年
#include <stdio.h>
int main()
{int age = 0;scanf("%d", &age);if(age>=18)printf("成年\n");elseprintf("未成年\n");return 0;
}

3.分支中包含多条语句

默认在 if else 语句中默认都只控制⼀条语句,⽐如:
#include <stdio.h>
int main()
{int age = 0;scanf("%d", &age);if(age >= 18)printf("成年了\n");printf("可以谈恋爱了\n");return 0;
}
上⾯的代码,你会发现输⼊的值不管是>=18 还是⼩于18,"可以谈恋爱了" 都会打印在屏幕上。

这是因为 if 语句只能控制⼀条语句,就是 printf("成年了\n"); ,if语句为真,则打印成年了, if语句为假,则不打印,对于 printf("可以谈恋爱了\n"); 是独⽴存在的,不管if语句的条件的真假,都会被执⾏。那如果我们要if语句同时控制2条语句,怎么办呢?那就要使用 {} 将代码括起来,else 后也可以跟上大括号。如下:

#include <stdio.h>
int main()
{int age = 0;scanf("%d", &age);if(age >= 18) //if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句{printf("成年了\n");printf("可以交⼥朋友了\n");}return 0;
}
#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;
}

4.嵌套if

if else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断。
⽐如:要求输⼊⼀个整数,判断输⼊的整数是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");elseprintf("输⼊的数字是负数\n");return 0;
}
再⽐如:
输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:负数。
#include <stdio.h>
int main()
{int num = 0;scanf("%d", &num);if(num>0){ //嵌套在if语句中,构成了嵌套的if语句if(num%2 == 0)printf("偶数\n");elseprintf("奇数\n");}else{printf("负数\n");}return 0;
}
练习:
输⼊⼀个⼈的年龄
如果年龄<18岁,打印"少年"
如果年龄在18岁⾄44岁打印"⻘年"
如果年龄在45岁⾄59岁打印"中⽼年"
如果年龄在60岁⾄89岁打印"⽼年"
如果90岁以上打印"⽼寿星"
参考代码:
//⽅法1
#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<=90)printf("⽼年\n");elseprintf("⽼寿星\n");return 0;
}//带上⼤括号更容易看明⽩
#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<=90)printf("⽼年\n");elseprintf("⽼寿星\n");}}}return 0;
}

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");elseprintf("haha\n");return 0;}

输出结果:

为什么呢?
这就是悬空 else 的问题,如果有多个 if else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配
上⾯的代码排版,让 else 和第⼀个 if 语句对⻬,让我们以为 else 是和第⼀个if匹配的,当 if 语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印 haha ,但实际上 else 是和第⼆个 if进⾏匹配的,这样后边的 if...else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不成立,嵌套 if else 就没机会执行了,最终啥都不打印
如果代码改成下⾯这样就更加容易理解了:
#include <stdio.h>
int main()
{int a = 0;int b = 2;if(a == 1){if(b == 2)printf("hehe\n");elseprintf("haha\n");}return 0;
}
或者如果我们希望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;
}
只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以⼤家以后在写代码的时候要注意括号的使用,让代码的可读性更⾼。

二.关系操作符

C 语⾔⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称 为“关系运算符”(relational operator),主要有下⾯6个。

  • > 大于运算符
  • < ⼩于运算符
  • >= ⼤于等于运算符
  • <= ⼩于等于运算符
  • == 相等运算符
  • != 不相等运算符

 关系表达式通常返回 0 或 1 ,表示真假。

C 语⾔中, 0 表示 假,所有非零值表示真。⽐如, 20 > 12 返回 1 12 > 20 返回 0 。关系表达式常⽤于 if while 结构。
if (x == 3) {printf("x is 3.\n");
}
注意: 相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符 ,不要混淆。有时候,可能会不⼩⼼写出下⾯的代码,它可以运⾏,但很容易出现意料之外的结果。
if (x = 3) ...
上⾯⽰例中,原意是 x == 3 ,但是不⼩⼼写成 x = 3 。这个式⼦表⽰对变量 x 赋值 3 ,它的返回值为 3 ,所以 if 判断总是为真。 为了防⽌出现这种错误,有的程序员喜欢将变量写在等号的右边
if (3 == x) ...
这样的话,如果把 == 误写成 = ,编译器就会报错。
/* 报错 */
if (3 = x) ...
另⼀个需要避免的错误是: 多个关系运算符不宜连用
i < j < k

上⾯⽰例中,连续使⽤两个⼩于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。

(i < j) < k
上⾯式⼦中, i < j 返回 0 1 ,所以最终是 0 1 与变量 k 进⾏⽐较。如果想要判断变量 j 的值是否在 i k 之间,应该使⽤下⾯的写法。
i < j && j < k //并且
比如:我们输⼊⼀个年龄,如果年龄在18岁~36岁之间,我们输出⻘年。 如果我们这样写
当我们输⼊10的时候,依然输出青年,如下图:
这是因为,我们先拿18和age中存放的10⽐较,表达式18<=10为假, 18<=age 的结果是0,再拿0和 36⽐较,0<=36为真,所以打印了⻘年 ,所以即使当age是10的时候,也能打印 ⻘年 ,逻辑上是有问题,这个代码应该怎么写呢?
#include <stdio.h>
int main()
{int age = 0;scanf("%d", &age);if(age>=18 && age<=36){printf("⻘年\n");}return 0;
}

三.条件操作符

条件操作符也叫 三目操作符(也是C语言中唯一一个三目操作运算符) ,需要接受三个操作数的,形式如下:
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果
exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
练习1:使用条件操作符表⽰下⾯代码的逻辑
#include <stdio.h>
int main(){int a = 0;int b = 0;scanf("%d %d", &a, &b);if (a > 5)b = 3;elseb = -3;printf("%d\n", b);return 0;
}改造后:
#include <stdio.h>
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);b = a>5 ? 3:-3;printf("%d\n", b);return 0;
}
练习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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/519061.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年6个最佳WordPress游戏化插件

在寻找最好的WordPress游戏化插件来提高网站的参与度&#xff1f; WordPress游戏化是将游戏元素应用到WordPress 网站的想法&#xff0c;例如得分、排行榜、奖项、测验结果共享等。 显然&#xff0c;WordPress 的核心并不包含这些类型的功能。借助WordPress游戏化插件&#x…

Windows下CMake使用PCL提示全局作用域没有_open等文件读写函数

表现 解决办法 在导入PCL之前导入Windows SDK相关头文件: #if _WIN32 #include <corecrt_io.h> #endif

【Web】浅浅地聊SnakeYaml反序列化两条常见利用链

目录 关于Yaml 关于SnakeYaml SnakeYaml反序列化利用 JdbcRowSetImpl链 ScriptEngineManager链 复现 基本原理 继续深入 关于Yaml 学过SpringBoot开发的师傅都知道&#xff0c;YAML和 Properties 文件都是常见的配置文件格式&#xff0c;用于存储键值对数据。 这里举…

DHCP部署与安全

在当今快速发展的网络世界中&#xff0c;动态主机配置协议&#xff08;DHCP&#xff09;扮演着至关重要的角色。这项技术不仅简化了网络管理&#xff0c;还提高了网络资源的利用率。本文旨在深入探讨DHCP的工作原理、优势以及如何有效部署和保护DHCP服务器。 一、DHCP作用 自…

微软亚太区AI智能应用创新业务负责人许豪,将出席“ISIG-AIGC技术与应用发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;AIGC开放社区、RPA中国、LowCode低码时代&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索A…

dolphinescheduler调用API

&#xff08;作者&#xff1a;陈玓玏&#xff09; 1. 打开api文档 api文档地址&#xff1a;http://{api server ip}:12345/dolphinscheduler/swagger-ui/index.html?languagezh_CN&langcn&#xff0c;我是用k8s部署的&#xff0c;所以ip和端口是由service决定的&…

接口测试工具Postman接口测试图文教程

一、前言 在前后端分离开发时&#xff0c;后端工作人员完成系统接口开发后&#xff0c;需要与前端人员对接&#xff0c;测试调试接口&#xff0c;验证接口的正确性可用性。而这要求前端开发进度和后端进度保持基本一致&#xff0c;任何一方的进度跟不上&#xff0c;都无法及时…

数学界高层犯了低级错误

以前根本不懂“算术代数几何”&#xff0c;认为似乎高不可攀&#xff0c;但早就觉得代数里面 adele 和 idele 的理论是纯概念的&#xff0c;没有技术含量&#xff0c;不可能用来解决数学问题。但当哈工大女研究生张扬讲&#xff08;她在北京听讲座期间&#xff09;&#xff0c;…

聚焦两会 | 从2024年政府工作报告看网络安全新机

在今年的《政府工作报告》&#xff08;下面简称“报告”&#xff09;中&#xff0c;除了对2023年里我国所取得的重大成就作了全面总结外&#xff0c;针对2024年全年经济社会发展作出的部署安排引起全国人民的关注。报告中与网络安全相关的内容也引起网络安全行业相关从事人员的…

事务 失效的八种情况

一、非public修饰的方法 Transactional注解只能在在public修饰的方法下使用。 /*** 私有方法上的注解&#xff0c;不生效&#xff08;因私有方法Spring扫描不到该方法&#xff0c;所以无法生成代理&#xff09;*/ Transactional private boolean test() {//test code } 非publ…

STM32标准库——(19)PWR电源控制

1.PWR简介 PWR属于外设部分 调用时需要先开启时钟 2.电源框图 这个图可以分为三个部分&#xff0c;最上面是模拟部分供电叫做VDDA&#xff0c;中间是数字部分供电&#xff0c;包括两块区域&#xff0c;VDD供电区域和1.8v供电区域&#xff0c;下面是后备供电&#xff0c;叫做VB…

构建读写分离的数据库集群

目录 1. 基础环境配置 &#xff08;1&#xff09;修改主机名 &#xff08;2&#xff09;编辑hosts文件 &#xff08;3&#xff09;配置Yum安装源 &#xff08;4&#xff09;安装JDK环境 2. 部署MariaDB主从数据库集群服务 &#xff08;1&#xff09;安装MariaDB服务 &a…