【C++】循环、控制流语句、指针、引用

8、循环(loops)
(1)for loops

for循环非常灵活,可以做很多事情。上图红框框出来的代码块就是一个for循环。

for是关键字
for后面内容分为三部分,每部分用分号;隔开

第一部分A是变量的声明,所以这里要声明变量,我们一般写int i=0;
变量名叫做i是一种惯例,可能是iterate的首字母。当然你也可以取你自己喜欢的名字。当然这个变量也不一定必须是int类型的,也不一定非得从0开始。

第二部分B是条件。如果条件为真,就执行for循环内部代码。这里i<5表示只要变量i小于5就满足循环条件。

第三部分C,i++会在for循环的下一次迭代之前被调用。所以我们也可以写i+=1或者写i=i+1。意思都是每迭代一次,变量i都要加1

D是循环体,就是每循环一次都要被执行的代码。

E是循环结束的标志。

再总结一遍:
指令指针指到第7行时,首先要做的是声明一个新变量i;接下来看这个变量是否满足条件;
如果条件B返回值为true,就跳到第9行(for循环体D),执行for循环体。当for循环体执行完毕后,指令指针就走到for循环的尾部花括号E处,看到E,指令指针就再跳转到C处执行C,就是给变量i加1;加完后指令指针再跳到B,看变量是否满足条件。

如果条件B返回值为true,就跳到第9行(for循环体D),执行for循环体。当for循环体执行完毕后,指令指针就走到for循环的尾部花括号E处,看到E,指令指针就再 跳转到C处执行C,就是给变量i加1;加完后指令指针再跳到B,看变量是否满足条件。

如此循环,直到B不满足条件,也就是B返回false,指令指针跳出for循环,也就是执行E后面的代码行(第12行)。

说明:
for循环的三部分:
第一部分(int i =0;)只是在开始时运行一次。
第二部分(i<5;)是一个比较后的bool类型。
第三部分(i++;)是要在for循环结束(})后被运行的。

所以,for循环我们也可以这样写:

所以,只要你不改变执行逻辑,你在代码形式上可以行云流水,你还可以在循环体内调用函数等等,无限可能。

(2)while loops

其实while循环和for循环一模一样!
首先,while循环同样要声明变量i,只是上例中的i已经存在了,并且i已经等于5了。
其次,while循环同样需要条件,上例的条件是i>0,满足条件就跳到循环体执行循环体的代码。
最后,循环体代码执行完毕后,同样是要执行变量的自增或者自减,这里是自减i--;否则就是无限循环了。

既然while循环和for循环一样,那为什么既生亮何生瑜?
我们约定成俗是这样使用的:当我们确实是想无限持续循环的,比如游戏,就是想让一帧帧一直循环,我们不在意究竟循环了多少次,循环到哪里,就是不介意是否要去声明i,也不介意i究竟是多少了,就是想无限循环下去,那我们就使用while循环。但是当我们想循环一个确定长度的数组,而且想追踪每个元素的信息,此时我们非常在意i究竟是多少了,此时用for循环。

在举个例子:

(3)do while

循环就是这3种写法。至于汇编及CPU指令上的循环,就非常复杂了,以后有机会再探讨。

9、控制流语句:continue、break、return

continue只能在循环中使用,表示进入这个循环的下一个迭代iteration。当然前提是有下一个迭代,如果没有就结束。

break是主要用于循环中,也可以用在switch语句中。break表示跳出其所在的循环,也就是终止它所在的那层循环。

return表示跳出函数。如果一个函数中,碰到return关键字,你就会退出这个函数。但是函数是要有一个返回值的,如果你只是return,那就相当于函数只返回了return本身,而return本身就相当于void,所以return本身只适用于void函数。

(1)continue

下面我们断点的方式看看程序是如何执行的:

小结:
a、对于for语句,第一执行for语句时,是先初始化i,然后判断条件。如果条件是true,就执行循环体,一直执行到for循环的最后的花括号},跳回到for语句,此时首先执行的是i++,然后再判断条件,条件true就是上面的一套流程;如果条件false就直接跳出循环体。

b、如果在循环体中遇到continue,就直接跳回for语句。那跳回for语句,就要执行for语句,那就是先执行i++,再判断条件,再根据条件,true就执行循环体,false就跳出循环。

(2)break

(3)return

但是return是可以用在函数的任何地方的,不限于循环中。

小结:
在C++语言中,这些if语句或其他条件语句、循环语句、控制流语句就是编程的基本逻辑。我们就是使用这些工具来控制程序的流程。这些也是编写应用程序的基本构建块。

10、指针

这里我们先讨论原始的指针raw point,不是智能指针smart point。

计算机处理的是内存。对计算机来说,内存就是一切。所以编程中最重要的事情就也是内存memory!当你编写一个应用程序并启动它时,所有程序都被载入到内存,所有的指令都是告诉cpu,你的代码是要做什么的。你的程序加载到内存也就是,cpu可以访问你的程序并开始执行程序中的指令。而指针就是管理和操作内存的。

(1)什么是指针?
指针就是一个整数,但是这个整数是内存地址的数字。所以指针就是一个地址。
这就好比,一个变量int a = 5;表示这个变量存储在某个内存单元中,存储的值是数字5。而一个指针 int *a = 5;表示这个指针a也是存储在内存的某个内存单元中,但这个内存单元中存的不是数字5,而是另一个内存单元的数字序号,这另一个内存单元里面存的是一个数字5。

说明:由于本部分内容是参考【16】C++指针_哔哩哔哩_bilibili 国外和我们还是有些不一样的,至少在某些名称的翻译上不会太一致。所以看不懂的同学先回看我的【C语言学习笔记】四、指针_通过变量名访问内存单元中的数据缺点-CSDN博客 这篇文章,这篇文章把指针说得非常明白了。然后你再回头看cherno的视频,你就理解了。

小结:
定义指针变量的时候就是:
先写这个指针指向的地址中存的数据的类型,当然你还没想好这个指针变量指向谁,那你就写个void类型指针吧。
然后再写*\号,星号就是普通变量和指针变量的区别。
然后再写指针变量的名称。
这样我们就定义了一个指针变量。

说明:我们是不需要定义指针变量自身的类型的!指针变量有的编译器指定是4个字节,有的是8个字节,anyway,都不重要。就是指针变量自身的数据类型是不用管的,是不重要的。因为指针就是存地址的,所以它的存放空间的大小不会变来变去。

当我们定义了一个指针变量后,这个指针变量还没有初始化,就是这个变量还没有赋值,此时这个变量的值是内存中这个地址上的原来的值,所以此时这个指针变量是一个野指针,你千万不能解引用重新赋值,你可能就修改了不该修改的地方,系统就崩溃了。
所以当我们定义一个指针变量时,一定要同时初始化赋值!如果你还没想好要指向什么地址,那你先指向NULL,就是指向0地址,这样就不会出现致命的错误,等你想好了你再修改。

当我们已经确定指针变量要指向哪里,那你就必须在最开始写对你指向的地方的数据的类型,这样这个指针变量才能读写那个数据。否则只是指向了那个数字的首地址,要读写时,到底是取几个字节,编译器就不知道了,所以就没法读写了。

11、引用
指针和引用是C++中翻来覆去经常被提及的两个概念。
引用是通过对指针的简单包装而来的,是一个在指针上的语法糖,更容易理解和阅读。
但是,引用就是引用现有的变量;就是引用已经存在的变量;而且引用本身也不是新的变量,所以引用本身是不占用内存的。不像指针,你得创建一个新的指针变量,然后设置它等于空指针或者其他类型的指针。但是,引用和指针是等价的,都可以改变变量的值。

这里再把前面的知识点来一波总结:

上图A处,仅仅就是一个声明语句:
声明了一个最最普通的变量a。声明变量a的意思就是告诉系统你要在内存中给我开辟一块儿内存,我要存变量a的值了。
a是变量名。
int表示变量a是int类型,int类型表示这个变量a在内存中的长度是4个字节。意思就是你在内存中给我开辟的内存块长度是4。要记住,变量类型指的是变量占用的空间的大小,以及这个空间中存储的数据的解析方法。
等号是赋值标识符。
5表示我要在内存块儿中存的数字是5这个数字,也就是要存个101这个二进制。所以5是变量值。

但是,当编译器看到语句A时,编译器会将变量名a映射成变量a存储的内存首地址。所以在编译器眼中,变量a就是a在内存中的首地址。cpu执行的是编译器编译后的指令,所以对cpu来说,cpu更不认识变量名a了,它只认识a的首地址。变量名a只是让我们人类理解的。

B:int* 表示是一个指针类型,这个指针类型变量指向的地址中存放的数据是int类型的。
C:int& 表示是一个引用类型,这个引用类型变量引用的地址里面存放的数据是int类型的。

所以,名字a, pi, ref,这些名字都是给人类看的,所以我们敲a, pi, ref,返回的都是这些变量的值,如上图D处。但是在编译器眼中,变量名a, pi, ref都是一些首地址,入上图E处。cpu眼中就没有D,只有E。编译器是人类和cpu之间的翻译,所以编译器有个对照表,只有编译器知道a和a的首地址是相互对应的。

从上图也可见,引用C和A没啥区别,所以应用就相当于是人类的一个别名alias一样,对编译器和cpu来说,都是a的首地址和int类型。

下面我们看个例子:

没有自增是因为自增了个地址,没有自增地址中的数据!自增了个寂寞!
下面看看如何使用指针进行自增、如何使用引用进行自增:

从上例可以看出:使用指针逻辑更清晰,使用应用代码更简介。该使用引用时还是使用引用比较方便。
上面就是普通变量、指针变量、引用变量的所有用法。如果还是混淆不明白的,再看下面的列子:

也所以,一旦你声明了一个引用变量,那你就必须给它赋值,你不能不赋值,因为赋值就意味着这个引用变量表示的值是哪个内存地址中的值。
也所以,你一旦创建了一个引用变量,你就不能更改引用地址了。因为这个引用变量其实是不存在的,它本身是没地址的。
也所以,引用是不能像指针那样指来指去,一会儿指这个地址,一会儿还可以指那个地址,然后再通过解码去改变这些地址中的值。而引用只能指向一个地址,能改变的只是这个地址中的值。

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

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

相关文章

Java五子棋之坐标校正

上篇针对了Java项目中的解构思维&#xff0c;在这篇内容中我们不妨从整体项目中拆解拿出一个非常重要的五子棋逻辑实现&#xff1a;坐标校正&#xff0c;我们如何使漫无目的鼠标点击变得有序化和可控化呢&#xff1f; 目录 一、从鼠标监听到获取坐标 1.MouseListener和Mouse…

VBA学习(16):工作表事件示例:输入数据后锁定单元格

在工作表单元格中输入数据后&#xff0c;该单元格就被锁定&#xff0c;不能再编辑。 打开VBE&#xff0c;在工程资源管理器中双击该工作表名称打开其代码模块&#xff0c;在其中输入下面的代码&#xff1a; 假设整个工作表的LockedFalse Private Sub Worksheet_Change(ByVal …

用JavaScript实现了一个简单的图像坐标点标注工具

这段代码实现了一个简单的图像标注工具&#xff0c;允许用户在加载的图像上进行点选标注&#xff0c;并且通过右键确认一个点序列来形成一个多边形。 标注效果如下 实现代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"U…

AI绘画Stable Diffusion 超强一键去除图片中的物体,免费使用!

大家好&#xff0c;我是设计师阿威 在生成图像时总有一些不完美的小瑕疵&#xff0c;比如多余的物体或碍眼的水印&#xff0c;它们破坏了图片的美感。但别担心&#xff0c;今天我们将介绍一款神奇的工具——sd-webui-cleaner&#xff0c;它可以帮助我们使用Stable Diffusion轻…

Rust高性能日志库tklog0.0.8—支持mod设置参数

tklog是rust高性能结构化日志库&#xff0c;支持同步日志&#xff0c;异步日志&#xff0c;支持自定义日志的输出格式&#xff0c;支持按时间&#xff0c;按文件大小分割日志文件&#xff0c;支持日志文件压缩备份&#xff0c;支持官方日志库标准API&#xff0c;支持mod独立参数…

怎么将文件免费扫描?这篇文章教你几个文件扫描方法

随着时间的流逝&#xff0c;我们所珍藏的纸质文件可能会面临破损和丢失的风险。 为了确保这些宝贵的资料得到妥善保管&#xff0c;将它们转换为电子格式并存储于电脑中无疑是一个明智之举。 那么&#xff0c;我们应当如何将这些纸质资料转换为易于管理和访问的电子文档呢&…

CMake基础教程

用法 cmake -B build // 配置&#xff0c;在源码目录用 -B 直接创建 build 目录并生成 build/Makefile cmake --build build -j4 // 构建&#xff0c;Linux会调用make&#xff0c;Windows会调用devenv.exe cmake --version 定义 -DCMAKE_INSTALL_PREFIX/opt/openvdb-8.0 /…

C++必修:模版的入门到实践

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 泛型编程 首先让我们来思考一个问题&#xff0c;如何实现一个交换函数&#x…

企业有必要使用OVSSL证书吗?

在数字化时代&#xff0c;SSL证书不仅仅是一种技术保障&#xff0c;它更是企业线上服务的重要组成部分。企业级OVSSL证书以其独特的优势&#xff0c;为企业带来了多重好处。 包含以下几点&#xff1a; 1、增强信任度&#xff1a;OV SSL证书在颁发前会对组织的身份进行验证&…

找出一个整型数组中的元素的最大值

这个问题在之前的文章中曾用其他方法解决&#xff0c;现在用类来处理&#xff0c;读者可以比较不同方法的特点。 编写程序&#xff1a; 运行结果&#xff1a; 程序分析&#xff1a; 程序看起来比较长&#xff0c;其实并不复杂&#xff0c;它包括以下3部分&#xff1a;…

生产实习Day13 ---- 神经网络模型介绍

文章目录 传统的神经网络模型注意力机制的引入注意力机制的本质Encoder-Decoder 框架注意力机制在 Encoder-Decoder 中的应用Self-Attention 机制Transformer 模型注意力机制的优势总结 传统的神经网络模型 在深度学习中&#xff0c;传统的神经网络模型&#xff0c;如循环神经…

【离散数学】图的随机生成和欧拉(回)路的确定(c语言实现)

实验要求 变量定义 因为如果我们使用局部变量&#xff0c;每一个函数都会使用这些变量&#xff0c;会让函数的参数越变越多。所以我们定义全局变量&#xff0c;这样就不用在参数中调用了。 #define MAX 100 int arrMap[MAX][MAX] { 0 };//图的矩阵 int degree[MAX] { 0 };…

[职场] 提升学历考研再就业有必要吗 #其他#知识分享

提升学历考研再就业有必要吗 有很多人觉得自己学历不够高&#xff0c;求职第一关可能就通过不了。因此想要继续攻读&#xff0c;最近有人问小编提升学历考研有必要吗&#xff1f;“硕士学历和三年的工作经验哪个更重要?” 这个还是要针对具体岗位而言。综合类型的岗位往往不需…

免费分享:2000-2020年中国长时间序列夜间灯光数据集(附下载方法)

夜间灯光数据集直观反映了地表夜间灯光亮度&#xff0c;进而揭示了人类活动强度&#xff0c;为分析城市扩张、人口迁移、经济发展等提供了连续、全面的视角&#xff0c;有助于深入理解中国城市化的历史进程和未来趋势。 数据简介 基于DMSP/OLS第四版非辐射定标夜间年平均灯光强…

【HW必备】用友NC-Cloud存在17处漏洞合集

漏洞简介 NC Cloud是用友公司推出的大型企业数字化平台。支持公有云、混合云、专属云的灵活部署模式。NC Cloud完全基于云原生架构&#xff0c;技术先进、性能稳定、自主安全可控&#xff0c;支撑大中型以及超大型集团企业N层多site混合云部署方案&#xff0c;支持整个系统高可…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第47课-动态切换内嵌blender展厅的壁画

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第47课-动态切换内嵌blender展厅的壁画 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编…

MySQL数据库(四):视图和索引

在数据库管理中&#xff0c;视图和索引是两种关键工具&#xff0c;它们各自发挥独特的作用以优化数据查询和管理。视图通过简化复杂查询、提高数据安全性和提供数据抽象&#xff0c;帮助用户轻松访问数据。而索引则通过加速查询、确保数据唯一性以及优化排序和分组操作&#xf…

哪个牌子充电宝好?好用充电宝排行榜!精选充电宝排行榜

在如今这个科技飞速发展的时代&#xff0c;充电宝已然成为我们日常生活中不可或缺的伴侣。无论是出差旅行&#xff0c;还是日常通勤&#xff0c;我们都离不开它为我们的电子设备保驾护航。然而&#xff0c;面对市场上琳琅满目的充电宝品牌&#xff0c;您是否感到眼花缭乱&#…

ONLYOFFICE 桌面编辑器 8.1 强势来袭:解锁全新PDF编辑、幻灯片优化与本地化体验,立即下载!

目录 一、轻松编辑PDF文件 1.1 编辑文本 1.2 添加、旋转和删除页面 1.3 插入和修改对象 1.4 添加注释和标注 1.5 切换编辑或查看模式 1.6 创建和填写表单 二、用幻灯片版式快速修改幻灯片 2.1 选择或创建幻灯片版式 2.2 应用幻灯片版式 2.3 修改幻灯片版式 2.4 使用…

[经验] candy是什么意思英语翻译 #笔记#其他#职场发展

candy是什么意思英语翻译 1、candy的意思 Candy是英语中的一个词汇&#xff0c;意思是糖果、糖果制品。Candy意为果脯的意思也不是很常见。 糖果是一种富含糖分的食品&#xff0c;主要由砂糖、粘合剂和食用色素等组成。糖果的种类可以很多&#xff0c;有硬糖、软糖、巧克力、…