循环与基础函数

循环与函数

  • 1.循环的三种方式
  • 2.循环的中断与空语句
  • 3.函数的定义与使用
  • 4.参数的作用域
  • 5.指针
  • 6.总结

1.循环的三种方式

我们最熟悉的循环为for和while,这两种循环方式在Python系列介绍过。在C++中,循环的基本逻辑同Python是类似的。c++中while循环的语法如下:

while(循环条件)
{循环体
}

这与python中的while很相似。
C++中,for循环与python有较大的区别,其标准的表达方式为:

for(初始循环变量;循环条件;循环变量更新)
{循环体
}

其中,for的三个参数可以根据需求选择性填写,甚至可以都可以不填写,因为在循环体中也可以补全循环条件或更新循环变量,在初始变量可以在循环外进行赋值,但是分号一定不能省略。现在我们分别用两种循环方式实现打印1到10之间的整数。
while循环:

int i=1;
while(i<10)
{cout<<i<<endl;i++;
}

for循环:

int i;
/*
我们可以不在for循环外面声明i,将声明和赋值都放在for里,如下所示:
for(int i=1;i<10;i++)
*/
for(i=1;i<10;i++)
{cout<<i<<endl;
}

下面我们展示不在括号中进行初始循环变量和循环变量更新:

int i=1;
for(;i<10;)
{cout<<i<<endl;
}

在C++中,for循环在一定程度上是while循环的延伸,它比while更简便。python中的while循环与C++中类似,但for循环却与C++中有较大差异,因为python中的for是从可迭代对象中逐个拿出元素。因此在Python中,for与while有较大的区别。
除了这两种循环以外,C++还有do-while循环,其标准表达式为:

do
{循环体
}while(循环条件);

它与while循环的区别在于do-while循环需要先执行后判断,这意味着do-while循环的循环体至少会执行一次。在多数情况下,do-while与while的执行结果是相同的,但如果循环条件在一开始就不成立,就可以看出两者的区别了:

int i=10;
do
{i++;cout<<i<<endl;
}while(i<5);
// 运行结果为:11
int i=10;
while(i<5)
{i++;cout<<i<<endl;
}
// 不会输出数字

do-while的设定会增大出错的可能性,因此python中没有这种循环方法。

2.循环的中断与空语句

中断
在Python中我讲过continue和break,这在C++中的用法也是相同的。break可以中断循环,直接跳到循环外继续运行代码,continue则会中断本次循环,开始下一次循环。以输出0到10之间的所有双数为例:

int i=0;
while(i<10)
{if(i%2!=0){i++;continue;}else{cout<<i<<endl;i++;}
}

break语句还可以帮我们把for循环的循环条件也放在循环体中:

for(int i=0;;)
{if(i<=5){cout<<i<<" ";i++;}else{break;}
}
// 输出为:0 1 2 3 4 5

空语句
在编程中,有时我们需要在某处不做任何操作,比如我们需要使用for做一个延时函数。在python中,需要使用空语句完成这个任务:

for i in range(1000):pass

在C++中,想要完成以上任务只要什么都不写就可以了:

for(int i=0;i<=1000;i++){}

3.函数的定义与使用

在C++中,想使用函数就需要先声明函数,再定义函数。声明函数需要给出函数的返回值类型、函数名称、参数数量及类型:
在这里插入图片描述

函数的声明必须在主函数之前,而定义则的位置则比较自由,可以自行选择写到主函数前或者主函数后:

int add(int a,int b); // 声明add函数
int sub(int a,int b); // 声明sub函数
int sub(int a,int b)  // 定义sub函数
{return a-b;
}
int main()
{int a=3,b=2;cout<<add(a,b)<<endl;cout<<sub(a,b)<<endl;
}
int add(int a,int b) // add函数定义
{return a+b;
}
// 结果为:5
//   	  1	

当然,我们也可以声明和定义一起写:

int sub(int a,int b)  // sub函数同时声明和定义
{return a-b;}
int main()
{int a=3,b=2;cout<<sub(a,b)<<endl;
}

C++中使用函数比较复杂,并且只能使用return语句返回一个指定类型的值。当然,如果我们希望函数没有返回值的话,可以声明返回值为void。在python中,我们用def定义函数,不需要额外声明返回值的类型,并且由于打包解包的存在,返回值的数量也并没有必须只有一个的限制。当然,python的函数还有更方便的参数定义和传递的方法,具体可以参考函数与编程。
def的全称是define,在C++中,define可以定义一个宏变量,宏变量可以在整个.cpp文件中使用。定义方法为:

# define 变量名 变量值

比如我们可以定义一个π,然后计算圆的面积:

# define pi 3.14
double acreage(double R)
{return pi*R*R;
}
int main()
{cout<<pi<<endl;cout<<acreage(2)<<endl;
}
// 输出为:3.14
//       12.56

4.参数的作用域

这里我们简单讲一点参数的作用域。函数定义中,函数的参数就是形式参数,比如上例中,acreage函数中定义的double类型的参数R就是形式参数。函数的形式参数与函数中另外定义的参数一样,只能在函数中进行使用,执行完函数内容后,这些参数都会被销毁,而主函数中定义的内容则要等到主函数运行结束后才会销毁。形式参数与函数内定义的其他参数可以与其他函数或主函数中定义的参数重名,计算机是不会分不清的。另外,一般情况下主函数中定义的参数如果没有通过传参的方式进入自定义的函数中,是不可以像宏定义一样在自定义函数里直接使用的。我们可以通过一个简单的例子理解一下:

void print(int a,int b)
{a+=10;b+=10;cout<<a<<" "<<b<<endl; // 虽然这里的a和b与主函数的两个变量重名,但内容并不会被搞混// cout<<c<<endl; // 如果运行这句代码则会报错
}
int main()
{int a=1,b=2;cout<<a<<" "<<b<<endl;int c=20; // 这里定义的c是不能在print函数中直接使用的print(a,b);cout<<a<<" "<<b<<endl; // 虽然这里的a和b与print函数的形参重名,但内容并不会被搞混
}
// 输出为:1 2
//       11 12
//        1 2

5.指针

在C++中,指针是一个很神奇的变量,它可以解决很多现实难题。也因此,指针一直是类C语言中的一大难点。我在这里讲指针是为了以后讲指针搭配函数、面对对象编程做铺垫,因此不会讲的太深,想深入了解的小伙伴可以点击这个链接。
大家应该都听过计算机的内存吧,所谓内存就是可以用来存储数据的空间,一个单位的内存我们可以简但地理解成容积为1的储物柜。那么使用内存就是将有意义的内容放入到没有装满的储物柜中。当然,为了保证存储有效,我们除了要将数据存起来,还应该知道存储该数据的储物柜的物理位置。所谓物理位置即为计算机通过给每个存储空间不同编号的方式区分和检索不同的存储空间所在的实际位置,这个编号就是地址值。众所周知,计算机的世界只有0和1,因此我们需要存储的内容以及我们对存储位置的编号都是通过0和1来表示的。我们此前的代码

int a=10;

他的意思就是找到一块可以装得下int类型的数字的空间,然后将10存到这个空间里。那么怎么才能找到这个存储着10的空间呢?我们可以简单地理解成我们给这个空间取了个名字叫做a,这样我们就可以通过a来找到存储10的空间的位置。但是计算机并不认识a,他只认识0和1,也就是说a也是由多个0和1组成的二进制数进行表示的。那么我们是不是可以把表示a的二进制数存起来,然后通过这个数找到a容器的物理位置,进而拿到其存储的具体内容呢?当然是可以的,而且这个用来表示a的二进制数就是指针变量。
当然,存储数据的类型不同,指针变量的类型也不同。理解了什么是指针,我们来简单的使用一下指针:

int* p; // 定义一个整数类型指针的变量
int a;
a=10;
p=&a; // &符号在C++中还可以用于取变量的地址
cout<<p<<" "<<*p; // *符号在C++中代表取某个地址里存储的内容
// 结果为:0x61fe14 10

由于地址变量如果用二进制展示的话,结果会非常长,因此计算机会自动用16进制数进行输出。
方便理解,我们可以将指针类型的变量理解成使用 变量名* 类型进行定义的变量,如双精度实型指针变量的定义方法为double*。但是要注意,如果我们想要声明多个指针变量时,需要在每一个变量名前都加上*,因为计算机可不是这样理解的。比如我们可以这样使用:

int a=10,b=2,*p1,*p2

如果不能理解就把它记住吧~

6.总结

本节我们讲解了C++中的循环、空语句、函数及其参数的作用域,并且初步带大家了解了C++中最难的内容之一——指针类型。下节我会继续和大家深入探索函数和数组。

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

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

相关文章

亚信安慧AntDB携核心业务系统数据库升级改造方案亮相“2023年国有企业应用场景发布会”

近日&#xff0c;亚信安慧AntDB数据库携核心业务系统数据库升级改造方案亮相“2023年国有企业应用场景发布会”。本次国有企业应用场景发布会由北京市国资委主办、中关村发展集团承办、中关村软件园公司协办&#xff0c;以“融通创新 智引未来”为主题&#xff0c;聚焦智慧城市…

visual studio 2022在查找和替换使用正则表达式查找if()

文件内容如下&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp1 {internal class Program{static void Main(string[] args){TempFunction();}private static void T…

当hashCode相同时,equals是否也相同?

目录 hashCode方法 equals方法 String类的hashCode和equals 用String为例 当hashCode相同时 总结 在Java中&#xff0c;理解对象的这两个基本方法—hashCode和equals对于编码是至关重要的&#xff0c;尤其是在处理集合类如HashMap和HashSet时。然而&#xff0c;一个常见的…

2023 北京国炬软件年度总结—JeecgBoot与敲敲云

2023年对于北京国炬软件公司来说是一个充满成就和创新的一年。 我们成功推出了APass零代码平台—敲敲云&#xff0c;一款能够在5分钟内搭建应用的新一代零代码平台。自2023年1月1号正式上线以来&#xff0c;敲敲云已经突破了10万注册用户&#xff0c;并与数百家战略合作伙伴达…

基于综合特征的细菌噬菌体宿主预测工具iPHoP (Integrated Phage HOst Prediction)的介绍以及使用方法详细流程

介绍 iPHoP&#xff08;Integrated Phage HOst Prediction&#xff09;是一种基于综合特征的细菌噬菌体宿主预测方法。它是通过整合基因组序列、蛋白质序列和宿主基因组信息来预测细菌噬菌体的宿主范围。 iPHoP的预测过程分为三个步骤&#xff1a;特征提取、特征选择和宿主预…

使用Go语言实现RESTful API

RESTful架构是一种设计风格&#xff0c;用于构建网络应用程序的API。它基于HTTP协议&#xff0c;并使用不同的HTTP方法&#xff08;如GET、POST、PUT、DELETE等&#xff09;来处理不同的操作。在Go语言中&#xff0c;我们可以使用标准库中的net/http包来实现RESTful API。 下面…

人工智能_机器学习089_DBSCAN聚类案例_DBSCAN聚类算法效果展示_使用轮廓系数来评分DBSCAN效果---人工智能工作笔记0129

dbscan = DBSCAN(eps = 0.2,min_samples =3) 我们指定半径是0.2 然后每个圆圈至少是3个数据就可以归为一类 dbscan.fit(X) 然后进行训练 # 得到每个样本的标签,分类结果 y_ =dbscan.labels_ 然后得到结果 ,注意这里不需要进行predict,因为fit直接就相当于分类了 plt.scatte…

前端跨域问题的解决思路

目录 前言 跨域问题的解决思路 一般跨域的解决方案 前言 做了一个简单页面&#xff0c;做了一些数据埋点&#xff0c;想通过企业微信机器人来推送数据&#xff0c;遇到了一些问题&#xff0c;顺便记录下。 跨域问题的解决思路 由于是项目比较简单&#xff0c;直接使用了aj…

Java项目调试实战:如何高效调试Spring Boot项目中的GET请求,并通过equalsIgnoreCase()解决大小写不一致问题

Java项目调试实战&#xff1a;如何高效调试Spring Boot项目中的GET请求&#xff0c;并通过equalsIgnoreCase解决大小写不一致问题 写在最前面全部过程Java equalsIgnoreCase() 方法idea中如何调试SpringBoot项目在IntelliJ IDEA中使用内置HTTP客户端设置断点和调试 补充&#x…

两阶段提交协议三阶段提交协议

两阶段提交协议 分布式事务是指会涉及到操作多个数据库的事务,在分布式系统中&#xff0c;各个节点之间在物理上相互独立&#xff0c;通过网络进行沟通和协调。 XA 就是 X/Open DTP 定义的交易中间件与数据库之间的接口规范&#xff08;即接口函数&#xff09;&#xff0c;交易…

华为云CES监控与飞书通知

华为云负载均衡连接数监控与飞书通知 在云服务的日常运维中&#xff0c;持续监控资源状态是保障系统稳定性的关键步骤之一。本文通过一个实际案例展示了如何使用华为云的Go SDK获取负载均衡器的连接数&#xff0c;并通过飞书Webhook发送通知到团队群组&#xff0c;以便运维人员…

Js的String的replace(和replaceAll(

EcmaJavascriptJs的String的 replace( 和 replaceAll( 方法 String.prototype.replaceString.prototype.replaceAll 相同点 都是String.prototype的函数都是用于字符串替换都是两个参数第一个参数都可以是正则或字符串第二参数都可以是字符串或者回调函数, 回调会传入一个参…

使用Kafka与Spark Streaming进行流数据集成

在当今的大数据时代&#xff0c;实时数据处理和分析已经变得至关重要。为了实现实时数据集成和分析&#xff0c;组合使用Apache Kafka和Apache Spark Streaming是一种常见的做法。本文将深入探讨如何使用Kafka与Spark Streaming进行流数据集成&#xff0c;以及如何构建强大的实…

zlib.decompressFile报错 【Bug已解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:方案1方案2此Bug解决方案总结寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了zlib.decompressFile报错 的问题。 问题: zlib.decompressFile报错,怎么解…

光伏逆变器MPPT的作用、原理及算法

MPPT是逆变器非常核心的技术&#xff0c;MPPT电压在进行光伏电站设计时一项非常关键的参数。 一、什么是MPPT&#xff1f; &#xff08;单块光伏组件的I-V、P-V曲线&#xff09; 上图中&#xff0c;光伏组件的输出电压和电流遵循I-V曲线(绿色)、P-V曲线(蓝色)&#xff0c;如果…

一篇文章学会Vim

一篇文章学会Vim 声明&#xff1a;以下内容均为我个人的理解&#xff0c;如果发现错误或者疑问可以联系我共同探讨 简介 Vim是一个高度可定制的终端文本编辑器&#xff0c;它可以很方便的创建和修改任何类型的文本。作为vi的升级版&#xff0c;有许多新的特性(以下列出的特性…

基于metersphere和supper-jacoco 测试覆盖率落地实践

一、背景及目标 背景 1、技术研发流程为测试 提供冒烟用例-开发根据用例自测-提测-开始测试&#xff0c;这一套流程&#xff0c;但是中间开发是否真实执行冒烟&#xff0c;测试并不知晓&#xff0c;而且测试提供冒烟用例是否符合标准也没法进行量化 2、公司产品属于saas产品&…

日常工作 经验总结

1,在使用vue2开发项目时,快捷有效的组件化component 若有参数传递时,可以通过这样传递 在component中: 2,上拉加载,下拉刷新 若是使用局部进行上拉加载 下拉刷新 且需要用到scroll-view时 那么需要切记scroll-view在内被mescroll-uni包裹。若场景有限 对于无数据显示…

PyTorch数据并行(DP/DDP)浅析

一直以来都是用的单机单卡训练模型&#xff0c;虽然很多情况下已经足够了&#xff0c;但总有一些情况得上分布式训练&#xff1a; 模型大到一张卡放不下&#xff1b;单张卡batch size不敢设太大&#xff0c;训练速度慢&#xff1b;当你有好几张卡&#xff0c;不想浪费&#xf…

YOLOv8改进 | 检测头篇 | ASFF改进YOLOv8检测头(全网首发)

一、本文介绍 本文给大家带来的改进机制是利用ASFF改进YOLOv8的检测头形成新的检测头Detect_ASFF,其主要创新是引入了一种自适应的空间特征融合方式,有效地过滤掉冲突信息,从而增强了尺度不变性。经过我的实验验证,修改后的检测头在所有的检测目标上均有大幅度的涨点效果,…