循环与基础函数

循环与函数

  • 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.mzph.cn/news/594480.shtml

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

相关文章

力扣每日一题99:恢复二叉搜索树

题目 给你二叉搜索树的根节点 root &#xff0c;该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下&#xff0c;恢复这棵树 。 示例 1&#xff1a; 输入&#xff1a;root [1,3,null,null,2] 输出&#xff1a;[3,1,null,null,2] 解释&#xff1a;3 不能是 1 …

【linux】ufw 的基本使用

碎碎念 所有的云平台的网络流量的进出基本上有三层&#xff0c;首先是虚拟网的流量控制&#xff0c;一般是通过子网访问控制列表来控制vpc也好子网也好的流量出入&#xff0c;其次是安全组控制一层&#xff0c;通过安全组规则控制一类/一组主机&#xff08;指EC2/ECS/VM/CE这些…

c语言结构体学习

文章目录 前言一、结构体的声明1&#xff0c;什么叫结构体?2&#xff0c;结构体的类型3,结构体变量的创建和初始化4&#xff0c;结构体的类型5&#xff0c;结构体的初始化 二、结构体的访问1&#xff0c;结构体成员的点操作符访问2&#xff0c;结构体体成员的指针访问 三、结构…

rime中州韵小狼毫 inputShow lua Filter 输入字符透传滤镜

在 rime中州韵小狼毫 inputShow lua Translator 一文中&#xff0c;我们通过 inputShow.lua 定制了 inputShow_translator&#xff0c;这使得我们的输入方案可以将用户输入的字符透传到候选列表中来。如下&#x1f447;&#xff1a; &#x1f446;上图中我们在候选列表中看到了…

基于ssm+vue服装商城购物系统

摘要 在基于SSM框架和Vue.js的服装商城购物系统中&#xff0c;整合了多种先进的技术&#xff0c;为电子商务领域的发展提供了有力支持。该系统不仅仅是技术层面的整合&#xff0c;更是对于业务流程和用户体验的深入考虑。以下是对该系统扩展的一些关键方面的讨论&#xff0c;以…

synchronized锁

synchronized 类锁&#xff1a;给类的静态方法加上synchronized 关键字进行修饰&#xff0c; 锁的是当前类class&#xff0c;一个静态同步方法拿到锁&#xff0c;其他静态同步方法就会等待静态同步方法和普通同步方法间是没有竞争的 对象锁&#xff1a;给类的方法加上synchron…

elasticsearch如何操作索引库里面的文档

上节介绍了索引库的CRUD&#xff0c;接下来操作索引库里面的文档 目录 一、添加文档 二、查询文档 三、删除文档 四、修改文档 一、添加文档 新增文档的DSL语法如下 POST /索引库名/_doc/文档id(不加id,es会自动生成) { "字段1":"值1", "字段2&q…

基于头脑风暴算法优化的Elman神经网络数据预测 - 附代码

基于头脑风暴算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于头脑风暴算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于头脑风暴优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

Vue3 的 emit 该怎么写, vue2 对比

Vue3 的 emit 该怎么写&#xff0c; vue2 对比 这是个新手问题&#xff0c;从 vue2 转到 vue3 之后&#xff0c;一时间不知道该怎么用它了。 vue2 用法 vue2 在 template 中 和 在方法中的用法如下&#xff1a; <template><button click"$emit(clicked, 要传…

贝锐花生壳全新功能:浏览器一键远程访问SSHRDP远程桌面

为了满足特定场景的远程访问需求&#xff0c;如&#xff1a;远程群晖NAS设备、远程SQL Server数据库/MySQL数据库、3389远程桌面&#xff08;RDP远程桌面&#xff09;、远程SSH、我的世界游戏联机…… 贝锐花生壳推出了场景映射服务&#xff0c;不仅提供满足相应场景的网络带宽…

在 2024 年搜索中提升排名的 7 项内容调整

忘掉关键词填充和算法追逐。2024 年的重点是 EEAT&#xff0c;宝贝&#xff01;谷歌希望最专业、最权威、最值得信赖&#xff08;EEAT&#xff09;的内容能够排名靠前&#xff0c;这就意味着您的内容需要成为专业知识、参与度和信任度的交响乐。 准备好让搜索引擎和人类都无法…

YOLOv5算法进阶改进(10)— 更换主干网络之MobileViTv3 | 轻量化Backbone

前言:Hello大家好,我是小哥谈。MobileViTv3是一种改进的模型架构,用于图像分类任务。它是在MobileViTv1和MobileViTv2的基础上进行改进的,通过引入新的模块和优化网络结构来提高性能。本节课就给大家介绍一下如何在主干网络中引入MobileViTv3网络结构,希望大家学习之后能够…

基于Java SSM框架实现四六级在线考试系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现四六级在线考试系统演示 摘要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多学院的之中&#xff0c;随之就产生了“四六级在线考试系统”&#xff0c;这样就让四六级在线考试系统更加方便…

kbdnso.dll文件缺失,软件或游戏报错的快速修复方法

很多小伙伴遇到电脑报错&#xff0c;提示“kbdnso.dll文件缺失&#xff0c;程序无法启动执行”时&#xff0c;不知道应该怎样处理&#xff0c;还以为是程序出现了问题&#xff0c;想卸载重装。 首先&#xff0c;先要了解“kbdnso.dll文件”是什么&#xff1f; kbdnso.dll是Win…

2007-2022年上市公司数字化转型数据(区分年报和管理层讨论)(含原始数据+处理代码+结果)

2007-2022年上市公司数字化转型数据&#xff08;年报和管理层讨论&#xff09;&#xff08;含原始数据处理代码结果&#xff09; 1、时间&#xff1a;2007-2022年 2、指标&#xff1a;统计年度、证券代码、人工智能技术、区块链技术、云计算技术、大数据技术、数字技术应用、…

requests库中Session对象超时解决过程

引言 在使用Python进行网络请求时&#xff0c;requests库是一个非常常用的工具。它提供了Session对象来管理和持久化参数&#xff0c;例如cookies、headers等。但是&#xff0c;对于一些需要长时间运行的请求&#xff0c;我们需要设置超时时间来避免长时间等待或者无限期阻塞的…

浏览器使用隧道代理HTTP:洞悉无界信息

在信息爆炸的时代&#xff0c;互联网已经成为获取信息的首选渠道。然而&#xff0c;在某些地区或情况下&#xff0c;访问某些网站可能会受到限制。这时&#xff0c;隧道代理HTTP便成为了一个重要的工具&#xff0c;帮助用户突破限制&#xff0c;洞悉无界信息。 一、隧道代理HT…

上海AI lab大模型微调

教程链接&#xff1a;InternLM学习教程链接 命令行演示结果&#xff1a; web演示结果

书生·浦语大模型全链路开源开放体系

书生浦语大模型全链路开源开放体系 大模型成为热门关键词书生浦语大模型开源历程书生浦语20B开源大模型性能从模型到应用书生浦语全链路开源开放体系数据预训练微调评测部署智能体 大模型成为热门关键词 大模型成为发展通用人工智能的重要途径 书生浦语大模型开源历程 书生浦语…

Apipost多Host服务配置

最近Apipost新增同环境下多host服务的配置功能&#xff0c;本篇文章带来该功能的使用场景及使用方法。 配置方法&#xff1a; 点击右上角眼睛标识进入环境管理 点击添加服务&#xff0c;输入服务名和URL 配置完成后需要在接口目录中选择该目录下需要使用的host服务&#xff0…