C语言逻辑语句

叠甲:以下文章主要是依靠我的实际编码学习中总结出来的经验之谈,求逻辑自洽,不能百分百保证正确,有错误、未定义、不合适的内容请尽情指出!

文章目录

  • 1.何为控制语句
  • 2.控制语句-分支语句
    • 2.1.if
    • 2.2.switch
  • 3.控制语句-循环语句
    • 3.1.while
    • 3.2.do...while
    • 3.3.for
  • 4.控制语句-转向语句
    • 4.1.break
    • 4.2.continue
    • 4.3.goto
  • 5.一些简单练习
    • 5.1.倒计时关机程序
    • 5.2.判断一个数是否为素数
    • 5.3.计算 1!+2!+...+n! 的值
    • 5.4.求解两个数的最小公倍数和最大公因数
      • 5.4.1.公倍数和公因数概念
      • 5.4.2.朴素求得最小公倍数
      • 5.4.3.朴素求得最大公约数
      • 5.4.4.LCM 和 GCD 的关系
      • 5.4.5.使用辗转相除法解决
    • 5.5.使用循环来清空缓冲区
    • 5.6.简易二分法查找算法

1.何为控制语句

一份 C 代码由多种语句组合而成, C 的语句主要分为下面几种:

  1. 表达式语句
  2. 函数调用语句
  3. 控制语句
  4. 复合语句
  5. 空语句

我这里主要给您提及控制语句的相关语法,其他的语句的相关概念您可以简单使用 google/bing/chatGPT 查询一下…

C 语言是结构化的程序设计语言,而这些结构实际上是对现实生活中的一种抽象,基本所有要做的事情都会包含“顺序、选择、循环”结构。

因此映射到 C 语言中就对应了三种控制语句:

  • 分支语句(if、switch
  • 循环语句(do...while、while、for
  • 跳转语句(break、goto、continue、return

控制语句可以按照某种要求,跳转到对应的代码中进行执行。

在分支语句和循环语句中,依靠表达式的真假(零表示真,非零为假)来跳转代码决定执行哪些语句。但跳转语句则无需在意真假,是无条件的跳转代码。

另外,多种控制语句直接也可以互相嵌套使用,构成复杂的代码…

2.控制语句-分支语句

2.1.if

if 语句会分为单分支、双分支、多分支的情况,一个 if 语句可以被视为一个整体,经过逻辑判断后,只能选择执行其中一个分支的代码。

而所谓的逻辑判断就是指判断表达式内的真假,if 语句一旦遇到:

  • 表达式的整体结果判定为假的时候,就会跳过跟在后面的代码块的所有内容,继续判断下一个表达式的真假
  • 表达式的整体结果判定为真的时候,就会立刻执行后面跟着的代码块的内容,执行完后就抛弃其他分支的代码,也就执行完一条 if 语句

而表达式的真和假根据 零表示真,非零为假 来判断,例如:

  • 对于代码 int num = 1; num + 3; num + 3 的整体结果就是真
  • 对于代玛 int num = 3; 3 - num3 - num 的整体结果就是假
  • 对于代码 int x = 9; int y; y = x;y = x 的整体结果就是真
//单分支语句的语法形式
if (表达式)
{语句0;
}
//双分支语句的语法形式
if (表达式)
{语句1;
}
else
{语法2;
}
//多分支语句的语法形式
if (表达式1)
{语句1;
}
else if (表达式2)
{语句2;
}
else if (表达式3)
{语句3;
}
//... 其他的 if 语句
else if (表达式n-1)
{语句n-1;
}
else
{  语句n;
}

这里举一个简单的例子:当用户输入一个数字,程序可以通过 if 语句检查该数字是否为正数、负数、零,并给出相应的提示信息。

//if 语句的使用例子
#include <stdio.h>
int main()
{int num;printf("请输入一个整数: ");scanf("%d", &num);if (num > 0){printf("这是一个正数\n");}else if (num < 0){printf("这是一个负数\n");}else{printf("这是零\n");}return 0;
}

写双分支语句、多分支语句时,如果分支内只需要执行一条语句,则可以省略代码块 {} ,但是语句特别多的时候最好是要养成加上代码块 {} 的习惯。

//省略代码块
#include <stdio.h>
int main()
{int num;printf("请输入一个整数: ");scanf("%d", &num);if (num > 0)printf("这是一个正数\n");else if (num < 0)printf("这是一个负数\n");elseprintf("这是零\n");return 0;
}

补充:分支语句的书写习惯对比

//两种 if 书写习惯的对比
//代码1
if (表达式) {//代码块1
} else {//代码块2
}//代码2
if(表达式)
{//代码块1
}
else
{//代码块2
}

代码1代码2 是写的较多两种形式,第一种强调是 if 以及内容是一个整体、第二种强调语句的“块”状,两种写法都可以,凭您的美感而言。

警告:关于 == 的判断写法

分支语句判断相等时最常见的错误就是将 == 写作 =,漏写一个等号带来的困扰有时是灾难性的(好在现代的编译器在很多情况下都会警告这一做法,不过您依然不能太过依赖这点)。

//有错误的代码
int num = 0;
if(num = 0) //这里原意是判断一个数是否为 0,但这里变成了赋值语句,把 num 又赋值为 0,导致表达式的判断结果为 0,也就是假,后续代码块将不会被执行...
{printf("hehe\n");
}

而关于这种写法有一种典型的检错方法,就是把变量和常量判断反过来写。

//两种 == 的判断写法
//代码 1
int num = 1;
if(num == 0)
{printf("hehe\n");
}
//代码 2
int num = 1;
if(0 == num) //这里把变量和常量反过来写了
{printf("hehe\n");
}

代码2 的写法会比较好一点,自带检错功能。假设 num == 0 错写成了 num = 0,那么意义就不同了(相当于 0 赋值给了 num),编译器不一定会报错,但是如果将 0 == num 写成 0 = num,那么编译器就会报错,因为无法使用变量赋值给一个常量。

不过这种方法也只能规避常量和变量的情况,无法规避变量和变量之间比较的情况。

警告:ifelse 的就近对应原则(悬空 else

//有问题的代码
#include <stdio.h>
int main()
{int num1 = 0;int num2 = 1;if(num1 == 1) //第一个 ifif(num2 == 1) //第二个 ifprintf("hello");else //这个 else 故意不进行缩进printf("limou");return 0;
}

实际上第二个 if 才是和 else 对应的(这里是故意不缩进的),这里发现程序结果是什么都不打印。这就是没有加上“代码块”的后果,有可能造成和您内心所需不同的结果。但是如果加上代码块就会情况就好了一些。

//没问题的代码
#include <stdio.h>
int main()
{int num1 = 0;int num2 = 1;if(num1 == 1) //第一个 if{if(num2 == 1) //第二个 if{printf("hello");}}else{printf("limou");}return 0;
}

这样代码就会在第一个表达式判断为假时,执行 printf("limou"); 从而打印 "limou"。因此加上代码块,一是增加代码可读性,二是减少逻辑错误。我个人推荐,就算是单分支语句也最好加上“代码块”,不要太过于省事。

2.2.switch

switch 语句的运行和 if 语句有些类似。

//switch 的语法形式
switch(整型表达式)
{case1:语句 1;break;case2:语句 2;break;case3:语句 3;break;//...还可以添加更多个 case 语句case 值 n-1:语句 n-1;break;case 值 n:语句 n;break;default:语句;break;
}
  • 整型表达式 的计算值和 case 后的值相匹配时,就会执行 case 后续的代码,直到遇到 break 时才结束 switch 语句
  • 其中 default 子句是默认选项,当 整型表达式 的结果均不满足 值1~值n 时,就会执行 default 后的语句
  • 每条 switch 只能有一条 default 子句,default 放在其他 case 之前之后都可以,并没有顺序要求
  • 最后一个 defaultbreak 不写也没有问题,当然最好还是加上为好,维护代码的时候可以减少 bug 的产生

case 后面的多条语句可以不加大括号,当然最好还是写上,逻辑会更加清晰一些…

补充:ifswitch 最大的差别在于 if 可以范围判断,switch 是枚举判断。

注意一个上面细节 直到遇到 break 时才结束 switch 语句,这句话很值得琢磨,如果匹配到对应的 case 选项后没有遇到 break 怎么办?可以看看下面的的代码,当 b = 1 或 2 时都是输出 "hello 你好 default",当 b = 3 或 4 时都是输出 "你好 default"

//缺少 break 的 switch 语句
#include <stdio.h>
int main()
{int num = 0;scanf("%d", &num);switch (num){case 1:case 2:printf("hello ");case 3:case 4:printf("你好 ");default:printf("default");}return 0;
}

因此,可以利用这一特性来达到多种选择对应同一个结果的目的。

//多个 case 标签指向相同的语句块
#include <stdio.h>int main()
{int choice;//提示用户输入选择printf("请选择选项(1、2、3): ");scanf("%d", &choice);//使用switch语句根据用户的选择执行相应的操作switch(choice){case 1:case 2:case 3:{printf("您选择了选项 1 或 2 或 3\n");break;}case 4:{printf("您选择了选项 4\n");break;}default:{printf("无效的选项\n");break;}}return 0;
}

警告:在一个 case 结束时,忘记写 break 语句也会引发一些逻辑错误,这种错误

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

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

相关文章

ue引擎游戏开发笔记(32)——为游戏添加新武器装备

1.需求分析&#xff1a; 游戏中角色不会只有一种武器&#xff0c;不同武器需要不同模型&#xff0c;甚至可能需要角色持握武器的不同位置&#xff0c;因此需要添加专门的武器类&#xff0c;方便武器后续更新&#xff0c;建立一个武器类。 2.操作实现&#xff1a; 1.在ue5中新建…

如何用DeepDiff测接口数据源变更?

开发同学最近变更了部分业务查询接口底层的数据源&#xff0c;希望测试同学能够针对这些接口进行一些回归验证&#xff0c;校验底层数据源更新前后业务查询接口返回的一致性&#xff0c;保证更新后对正常业务没有影响。 这个回归测试和一般接口测试有所区别&#xff0c;不仅仅…

C++基础-编程练习题2

文章目录 前言一、查找“支撑数”二、数组元素的查找三、爬楼梯四、数字交换五、找高于平均分的人 前言 C基础-编程练习题和答案 一、查找“支撑数” 【试题描述】 在已知一组整数中&#xff0c; 有这样一种数非常怪&#xff0c; 它们不在第一个&#xff0c; 也不在最后一个&…

使用Simulink Test进行单元测试

本文摘要&#xff1a;主要介绍如何利用Simulink Test工具箱&#xff0c;对模型进行单元测试。内容包括&#xff0c;如何创建Test Harness模型&#xff0c;如何自动生成excel格式的测试用例模板来创建测试用例&#xff0c;如何手动填写excel格式的测试用例模板来手动创建测试用例…

精通 Docker:简化开发、部署与安全保障

踏上 Docker 之旅&#xff0c;每一条命令都是高效与可靠的新境界。Docker 彻底改变了软件开发&#xff0c;为构建、部署和保障应用程序提供了前所未有的便利。从打造精益敏捷的镜像到编排复杂的微服务架构&#xff0c;Docker 让开发人员和运维人员都倍感轻松。让我们深入探索 D…

Redis---------实现查询缓存业务

目录 数据库与缓存之间的工作业务逻辑&#xff1a; 接下来看查询缓存代码实现&#xff0c;主要是捋清楚业务逻辑&#xff0c;代码实现是死的&#xff1a; Controller: Service: P37作业实现&#xff1a;总体逻辑跟上面的业务逻辑差不多 Controller&#xff1a; Service&#…

头歌-Java编程基础进阶

第1关 两整数的四则运算 package step1;import java.util.Scanner;public class Arithmetic2Num {public static void main(String[] args) { // ---------------------Begin------------------------Scanner scnew Scanner(System.in);int asc.nextInt();int bsc.nextInt();…

对象存储的几个概念

媒体存储-帮助中心 - 天翼云 媒体存储 对象存储&#xff08;经典版&#xff09;I型 -帮助中心- 天翼云 OOS https://www.ctyun.cn/document/10026735/10028989 ZOS 成长地图_对象存储服务 OBS OBS 以上是对象存储 的几个概念&#xff0c;可以反复的理解下。

Azure AKS日志查询KQL表达式

背景需求 Azure&#xff08;Global&#xff09; AKS集群中&#xff0c;需要查询部署服务的历史日志&#xff0c;例如&#xff1a;我部署了服务A&#xff0c;但服务A的上一个版本Pod已经被杀掉由于版本的更新迭代&#xff0c;而我在命令行中只能看到当前版本的pod日志&#xff…

SparkSql介绍

概述 SparkSQL&#xff0c;顾名思义&#xff0c;就是Spark生态体系中的构建在SparkCore基础之上的一个基于SQL的计算模块。SparkSQL的前身不叫SparkSQL&#xff0c;而叫Shark&#xff0c;最开始的时候底层代码优化&#xff0c;sql的解析、执行引擎等等完全基于Hive&#xff0c…

使用 Lambda 匿名函数在 Python 中轻松地进行排序

排序是 Python 编程中的常见操作&#xff0c;Python 提供了许多强大的函数方法方便的完成排序功能&#xff0c;比如 sorted() 和 sort()。在本文中&#xff0c;我们将结合 lambda 函数进行排序。它被称为匿名函数&#xff0c;可以灵活轻松地完成各种形式的排序。 字符串列表排…

前端安全防护实战:XSS、CSRF防御与同源策略详解(react 案例)

前端安全防护实战中&#xff0c;主要涉及三个方面&#xff1a;XSS (Cross-Site Scripting) 攻击的防御、CSRF (Cross-Site Request Forgery) 攻击的防御&#xff0c;以及浏览器的同源策略。以下是这三个方面的详细说明&#xff1a; XSS 防御详解 XSS 概述 XSS攻击是一种让攻…

科创板门槛升级!解析中国量子企业的上市之路与国际比拼

4月30日晚&#xff0c;中国证监会于发布了修订后的《科创属性评价指引&#xff08;试行&#xff09;》&#xff08;以下简称“新指引”&#xff09;&#xff0c;该指引自发布日起正式生效。本次修订对原有指引中的部分标准进行了调整&#xff0c;具体如下&#xff1a; 1&#x…

如何用Kimi,5秒1步生成流程图

引言 在当前快节奏的工作环境中&#xff0c;拥有快速、专业且高效的工具不可或缺。 Kimi不仅能在5秒内生成专业的流程图&#xff08;kimi&#xff09;&#xff0c;还允许实时编辑和预览&#xff0c;大幅简化了传统流程图的制作过程。 这种迅速的生成能力和高度的可定制性使得…

有哪些方法可以在运行时动态生成一个Java类?

使用 Java 反射 API&#x1f6a9;&#xff1a; Java 的反射 API 允许在运行时查询和操作类和对象。虽然反射 API 本身不直接提供生成新类的功能&#xff0c;但可以用于动态调用构造函数、方法和访问字段&#xff0c;这在某些情况下可以作为动态生成类的一部分。 字节码操作库&…

Day28:ElasticSearch入门、Spring整合ES、开发社区搜索功能

ElasticSearch入门 Elasticsearch简介 一个分布式的、Restful风格的搜索引擎。支持对各种类型的数据的检索&#xff08;非结构化的也可以&#xff09;。搜索速度快&#xff0c;可以提供实时的搜索服务。便于水平扩展&#xff08;集群式部署&#xff09;&#xff0c;每秒可以处…

一文读懂计算机视觉4大任务:分类任务、检测任务、目标分割任务、关键点检测任务

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

算法系列--多源BFS问题

&#x1f495;"对相爱的人来说&#xff0c;对方的心意&#xff0c;才是最好的房子。"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–多源BFS问题 大家好,今天为大家带来的是算法系列--多源BFS问题 前言: 之前我们已经学习过单源的最短路问…

【Toritoise SVN】SVN 怎么忽略文件夹下的所有文件但是不忽略文件夹本身

比如&#xff1a;忽略 Assets\StreamingAssets\LocalAsset文件夹下的所有文件但是不忽略LocalAsset这个文件夹 在TortoiseSVN中&#xff0c;你可以通过以下步骤来修改文件夹的svn:ignore属性&#xff1a; 打开Windows资源管理器&#xff0c;导航到你的工作副本中的Assets\Stre…

VMware虚拟机问题解决方案

1、运行虚拟机系统蓝屏 可能的原因有两个: 1). 虚拟机所在磁盘的空间不足 ; -------> 清理磁盘空间 。 2). 操作系统版本高, 需要适配新版本的Vmware ; ------> 卸载Vmware15版本, 安装Vmware16版本 。 2、卸载VMware的步骤 1&#xff09;卸载已经安装的VMware 从控制面…