C++篇 语 句
到目前为止,我们只见过两种语句: return 语句和表达式语句。根据语句对执行顺 序的影响,C 语言其余语句大多属于以下 3 大类。
- 选择语句: if 语句和 switch 语句。
- 循环语句: while 语句, do...while 语句和 for 语句。
- 跳转语句: break 语句, continue 语句和 goto 语句 ( return 语句也属于此类)。
- 复合语句 (把几条语句组合成一条语句)。
- 空语句 (不执行任何操作)。
一、选择语句
if 语句
if 语句最简单的格式为:
if (expr) statement
比如下面这个示例:
if (line_num == MAXLINES)line_num = 0;
注意: 不要混淆 == 和 =。语句 if (i == 0) ... 测试 i 是否等于 0;而语句 if (i = 0) ... 则是先把 0 赋值给 i,然后测试赋值表达式的值是否非零,在这种情况下,测试总 是失败的。
复合语句
如果我们想用 if 语句控制两条或者更多条语句,该怎么办呢?这时,就需要引入复合语句了。复合语句格式如下:
{ statements }
通过将多条语句用花括号括起来,可以强制编译器将其作为一条语句来处理。如:
{line_num = 0;page_num++;
}
这样,我们就可以在 if 语句中使用复合语句了:
if (line_num == MAX_LINES) {line_num = 0;page_num++;
}
e l s e 子句
if 语句还可以有 else 子句,其格式为:
if (expr) statement
else statement
如果 expr 的值为 0,那么就执行 else 子句。如:
if (i > j)max = i;
elsemax = j;
C 语言对 if 语句内部的语句没有任何限制。事实上,在 if 语句内部嵌套其他 if 语句是非常普遍的。比如,我们可以用下面的语句找出 i, j, k 中的最大值:
if (i > j) {if (i > k)max = i;elsemax = k;
} else {if (j > k)max = j;else max = k;
}
级联式 if 语句
写程序时,我们经常需要判定一系列条件,直到某个条件为真。级联式 if 语句往往 是编写这类程序的最好方法。如:
if (n < 0)printf("n is less than 0\n");
else if (n == 0)printf("n is equal to 0\n");else printf("n is greater than 0\n");
虽然第二个 if 语句是嵌套在第一个 if 语句内部的,但 C 程序员通常不会像上面一 样对第二个 if 语句进行缩进,而是写成下面这样:
if (n < 0)printf("n is less than 0\n");
else if (n == 0)printf("n is equal to 0\n");
elseprintf("n is greater than 0\n");
因此,级联式 if 语句有自己独特的书写形式:
if (expr)statement
else if (expr)statement
...
else if (expr)statement
elsestatement
级联式 if 语句不是新的语句类型。它仅仅是普通的 if 语句,只是碰巧它 的 else 子句又是一条新的 if 语句,以此类推...
悬空 e l s e 问题:
当 if 语句嵌套时,我们需要当心臭名昭著的"悬空 else"问题。思考下面这个例子:
#include<iostream>
#define SIZE(a) (sizeof(a) / sizeof(a[0]))using namespace std;int main(){
int x = 10, y = 0, result;
if (y != 0)if (x != 0)result = x / y;
else printf("Error: y is equal to 0\n");return 0;
}
上面 else 子句究竟属于哪一个 if 语句呢?缩进暗示它属于最外层的 if 语句。然 而 C 语言遵循的规则是 else 子句应该属于离它最近的,且还没有和其他 else 匹配 的 if 语句。因此,在这个例子中, else 子句属于内层的 if 语句。
为了使 else 子句属于外层的 if 语句,我们可以用花括号将内层的 if 语句括起 来:
if (y != 0) {if (x != 0)result = x / y;
} elseprintf("Error: y is equal to 0\n");
条件表达式
C 语言提供了一种特殊的运算符——条件运算符,这种运算符可以根据条件产生两个 值中的一个。条件运算符由 ? 和 : 组成,其格式如下:
expr1 ? expr2 : expr3
条件运算符是 C 语言中唯一一个有 3 个操作数的运算符,因此我们又把它称为三目运算符。 条件表达式的求值步骤是:首先计算 expr1 的值,如果该值不为 0,则计算 expr2 的 值,并且把 expr2 的值当作整个表达式的值;如果 expr1 的值为 0,那么计算 expr3 的值,并把 expr3 的值当作整个表达式的值。 请看下面的示例:
int i, j, k;
i = 1;
j = 2;
k = i > j ? i : j;
k = i > j ? i++ : j++;
k = (i >= 0 ? i : 0) + j;
顺便说以下,最后一条语句的圆括号是必须的,因为三目运算符的优先级只比赋值运算符的优先级高一点。
布尔值
bool flag = true;
switch 语句
在日常编程中,常常需要把表达式和一些列值进行比较,从中找出匹配的值。前面可 以看到,级联式 if 语句可以可以达到这个目的。
if (grade == 4)printf("Excellent");
else if (grade == 3)printf("Good");
else if (grade == 2)printf("Average");
else if (grade == 1)printf("Poor");
else if (grade == 0)printf("Failing");
else printf("Illegal grade");
C 语言提供了 switch 语句作为这类级联式 if 语句的替换。如上面的例子可以写成 这样:
switch (grade) {
case 4: printf("Excellent");break;
case 3: printf("Good");break;
case 2: printf("Average");break;
case 1: printf("Poor");break;
case 0: printf("Failing");break;
default:printf("Illegal grade");break;
}
switch 语句往往比级联式 if 语句更容易阅读。此外,switch 语句的执行速度也会比 if 语句快一些。
switch 语句相对来说比较复杂,下面我们来看以下它的组成成分:
控制表达式。 switch 后边表达式的值必须是整数类型。C 语言把字符类型也当作整 数来处理,因此 switch 语句也可以对字符类型进行判定。但是,不能判定浮点数和字符串 (why?)。
分支标号。 case 后边必须跟常量表达式,并且常量表达式的值必须是整数(字符类型也可以)。 常量表达式:即能够在编译期间求值的表达式。
语句。每个 case 后面可以跟任意数量的语句 (不需要用花括号括起来)。每组语句的 最后通常是一条 break 语句。
注意switch语句不能进行范围比较,switch语句在C 语言中不允许有重复的分支标号,但对分支的顺序没有要求,特别是 default 分支不一 定要放到最后。而且 switch 语句不要求一定要有 default 分支。如果 default 不存在, 而且控制表达式的值和任何一个分支标号都不匹配,控制会直接传递给 switch 后面的语句。
多个分支标号,可以共用一组语句。如:
switch (grade) {
case 4: case 3: case 2: case 1: printf("Passing");break;
case 0: printf("Failing");break;
default:printf("Illegal grade");break;
}
case 穿透(/*break through*/)
switch (grade) {
case 4: printf("Excellent");
case 3: printf("Good");
case 2: printf("Average");
case 1: printf("Poor");
case 0: printf("Failing");
default:printf("Illegal grade");
}
【练】利用 switch 语句编写一个程序,把用数字表示的成绩转化为字母表示的等级。 评定规则为: A为 90~100,B为 80~89,C为 70~79,D 为 60~69,F 为 0~59。如果成 绩高于100或者低于0,则显示出错消息。
二、循环语句
C 语言提供了 3 种循环语句,即while语句,do...while语句和for语句。while语句在循环体执行之前测试控制表达式,do...while循环在循环体执行之后测试控制表达式,for语句则非常适合那些递增或递减计数变量的循环。
while 语句
i = 10;
while (i > 0) {
printf("Counting down: %d\n", i);
i--;}
如果控制表达式的值始终非零,那么while语句将永远执行下去。事实上,有时候我们会故意用非零的常量表达式作为控制表达式,以此来构造无限循环。
/* idiom */
while (1) ...
除非循环体内含有跳出循环的控制语句 (break, goto, return) 或者调用了导致程序终止的函数,否则上述形式的while语句将永远执行下去。
do...while 语句
do...while语句和while语句关系紧密。事实上,do...while语句本质上就是while语句,只不过其控制表达式是在每次执行完循环体之后进行判定的。do...while语句的格式如下:
do statement while (expr) ;
执行do...while语句时,先执行循环体,再计算控制表达式的值。如果表达式的值非零,那么继续执行循环体,然后再计算表达式的值;如果表达式的值为零,则终止do...while语句的执行。如:
i = 10;
do {printf("Counting down: %d\n"; i);i--;
} while (i > 0);
do...while 语句和 while 语句的唯一区别是:do...while 语句的循环体至少会执行一次,而 while 语句在控制表达式的值初始为 0 时,一次都不会执行。
for 语句
现在介绍 C 语言中最后一种循环,也是功能最强大的一种循环:for语句。for语句非常适合那些递增或递减计数变量的循环,当然它也可以灵活地应用在许多其他类型的循环中。for语句的格式如下:
for (expr1; expr2; expr3) statement
for(i = 10; i > 0; i--) printf("Counting down: %d\n"; i);
省略 for 语句中的表达式
for 语句远比现在看到的更加灵活,C 语言允许 for 语句省略一些或者是全部的表达式。
如果省略 expr1,那么在执行循环前没有初始化的操作:
i = 10;
for (; i > 0; --i) printf("Counting down: %d\n", i);
如果省略 expr3,那么循环体需要确保 expr2 的值最终会变成 0:
for (i = 10; i > 0; ) printf("Counting down: %d\n", i--);
当同时省略 expr1 和 expr3 时,那么for语句和while语句就没有任何分别,如:
i = 10;
for (; i > 0; ) printf("Counting down: %d\n", i--);
等价于
i = 10;
while (i > 0) printf("Counting down: %d\n", i--);
在 C99 中,for语句的第一个表达式可以替换为一个声明,这一特性使得程序员可以声明一个用于循环的变量:
for (int i = 0; i < n; i++) ...
变量 i 不需要在该语句前进行声明。如果变量 i 在之前已经进行了声明,这个语句将创建一个新的 i,且该变量只能在循环内使用。for语句声明的变量在循环外是不可见的:
for (int i = 0; i < n; i++)
{ ... printf("%d", i); /* legal */ ...
}
printf("%d", i); /* Wrong */
顺便提一下,for 语句可以声明多个变量,只要它们的类型相同:
for (int i = 0, j = 0; i < n; i++) ...
逗号表达式
逗号表达式的求值分为两步:第一步,计算 expr1 并且扔掉计算出的值;第二步,计算 expr2,把这个值作为整个表达式的值。对 expr1 的计算应该产生一些副作用,否则 expr1 就没有存在的必要了。举个例子:
逗号表达式是左结合的,因此编译器会把表达式
i = 1, j = 2, k = i + j
解释为 (i = 1, j = 2), k = i + j
C 语言之所以提供逗号运算符,是为了在只能有一个表达式的地方可以使用两个甚至是多个表达式。换句话说,逗号运算符允许将两个表达式"粘"在一起,构成一个表达式 (和复合语句类似,复合语句可以把一组语句当成一条语句来使用)。
for (sum = 0, i = 1; i <= N; i++) sum += i;
三、跳转语句
break
switch, while, do...while 和 for 语句。但是当这些语句嵌套时,break只能跳出包含break语句的最内层嵌套。
continue
break 语句会把控制转移到整个循环的后面,而 continue 会将控制转移到循环体的末尾。break 语句会跳出循环,而 continue 语句仍然留在循环体内。break 语句和continue 语句还有另外一个区别:break 语句可以用于 switch 语句和循环,而continue 只能用于循环。
相关文章:

C++篇 语 句
到目前为止,我们只见过两种语句: return 语句和表达式语句。根据语句对执行顺 序的影响,C 语言其余语句大多属于以下 3 大类。 选择语句: if 语句和 switch 语句。循环语句: while 语句, do...while 语句和…...

简洁的在线观影开源项目
公众号:【可乐前端】,每天3分钟学习一个优秀的开源项目,分享web面试与实战知识。 每天3分钟开源 hi,这里是每天3分钟开源,很高兴又跟大家见面了,今天介绍的开源项目简介如下: 仓库名࿱…...
VB超级模块函数VB读写记事本-防止乱码支持UTF-8和GB2312编码
Private Sub Command1_Click() Writein “C:\Users\Administrator\Desktop\1.txt”, “文本文内容” End Sub Private Sub Form_Load() Text1 ReadANSI(“C:\Users\Administrator\Desktop\1.txt”) Text2 ReadUTF8(“C:\Users\Administrator\Desktop\1.txt”) End Sub 写入…...

XSS靶场-DOM型初级关卡
一、环境 XSS靶场 二、闯关 1、第一关 先看源码 使用DOM型,获取h2标签,使用innerHTML将内容插入到h2中 我们直接插入<script>标签试一下 明显插入到h2标签中了,为什么不显示呢?看一下官方文档 尽管插入进去了࿰…...

【嵌入式高级C语言】10:C语言文件
文章目录 1 文件的概述1.1 文件分类(存储介质)1.2 磁盘文件分类(存储方式)1.3 二进制文件和文本文件的区别 2 文件缓冲区3 文件指针4 文件的API4.1 打开文件4.2 关闭文件4.3 重新定位流4.3.1 fseek4.3.2 ftell4.3.3 rewind 4.4 字…...

创建数据表
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 如果要进行数据表的创建 create table 表名称 (列名称 类型 [DEFAULT 默认值 ] ,列名称 类型 [DEFAULT 默认值 ] ,列名称 类型 [DEFAULT 默认值 ] ,...列名称 类型 [DEFAULT 默认值 ] )…...

C语言字符串型常量
在C语言中,字符串型常量是由一系列字符组成的常量。字符串常量在C中以双引号(")括起来,例如:“Hello, World!”。字符串常量在C中是不可变的,也就是说,一旦定义,就不能修改其内…...

计算机网络 八股
计算机网络体系结构 OSI:物理层、数据链路层、网络层、运输层、会话层、表示层、应用层...
深入了解 Jetpack Compose 中的 Modifier
Jetpack Compose 是 Android 中用于构建用户界面的现代化工具包。其中,Modifier 是一个非常重要的概念,它允许我们对 UI 组件进行各种样式和布局的调整。在本篇博客中,我们将深入了解 Modifier,以及如何在 Compose 中使用它。 什…...
【数据库】聚合函数|group by分组|having|where|排序|函数 关键字的使用
目录 一、聚合函数 1、max() 2、min() 3、avg() 4、sum() 5、count() 二、group by 分组汇总 一般聚合函数配合着group by(分组)语句进行使用 把一组的数据放到一起,再配合聚合函数进行使用 三、having having语句 做筛选的 四、where和having的作用以及区…...

docker安装mongoDB及使用
一.mongodb是什么? MongoDB是一个NoSQL的非关系型数据库 ,支持海量数据存储,高性能的读写 1.mongo的体系结构 SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档colum…...

Linux 之五:权限管理(文件权限和用户管理)
1. 文件权限 在Linux系统中,文件权限是一个非常基础且重要的安全机制。它决定了用户和用户组对文件或目录的访问控制级别。 每个文件或目录都有一个包含9个字符的权限模式,这些字符分为三组,每组三个字符,分别对应文件所有者的权限…...

基于YOLOv8深度学习的葡萄病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...
MySQL 在聚合函数查询的结构中继续过滤
HAVING HAVING 关键字和 WHERE 关键字都可以用来过滤数据,且 HAVING 支持 WHERE 关键字中所有的操作符和语法,如果想要从 GROUP BY 分组中进行筛选的话,不是用 WHERE 而是使用 HAVING 来进行聚合函数的筛选。 语法 SELECT <列名1>, <列名2>,…...

UE4.27_ParticleSystem(没写完的材料)
UE4.27_ParticleSystem(没写完的材料) 参考实例: UE4[蓝图]下雪效果及雪的材质的实现...

腾讯云轻量服务器流量用完了怎么办?停机吗?
腾讯云轻量服务器流量用完了怎么办?超额流量另外支付流量费,流量价格为0.8元/GB,会自动扣你的腾讯云余额,如果你的腾讯云账号余额不足,那么你的轻量应用服务器会面临停机,停机后外网无法访问,继…...
块级作用域、变量提升
1.块级作用域 JS 中作用域有:全局作用域、函数作用域。没有块作用域的概念。ECMAScript 6(简称 ES6)中新增了块级作用域。块作用域由 { } 包括,if 语句和 for 语句里面的{ }也属于块作用域。 2.变量提升 如果变量声明在函数里面,则将变量声…...
c# 连接oracle 及对应获取数据集
1、数据库配置xml,首先连接成功后会自动创建xml并保存到对应xml,如下 static string ConnPath AppDomain.CurrentDomain.BaseDirectory "ConnOrcle.xml"; 声明xml名称,便于后续写入对应数据库参数 2、创建xml /// <summar…...

JS直接量及其相关对象
什么是直接量 直接量是指不需要创建对象就可以直接使用的变量。ES中的直接量主要有三种类型:表示字符串的string类型、表示数字的number类型和表示true/false的boolean类型。当我们直接将值赋给变量后,ES就会自动判断其类型,而且当参数发生变…...

一 windso10 笔记本刷linux cent os7.9系统
1:准备材料 16G以上U盘, 笔记本一台 镜像选了阿里云镜像:centos-7-isos-x86_64安装包下载_开源镜像站-阿里云 软件:链接:https://pan.baidu.com/s/13WDp2bBU1Pdx4gRDfmBetg 提取码:09s3 2:把镜像写入U盘,本人已经写入好了,选择镜像,点开始就是,确定等…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...