循环与基础函数

news2024/11/15 23:47:51

循环与函数

  • 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.coloradmin.cn/o/1353952.html

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

相关文章

词嵌入位置编码的实现(基于pytorch)

背景介绍 在transformers架构当中&#xff0c;对于词向量的输入需要加上原本词对应的位置信息&#xff0c;作为输入到模型中训练的input&#xff0c;那具体的位置编码如何实现呢&#xff1f;本篇博客就跟大家一起分享一下对应的步骤 位置编码的公式 对于词向量的位置编码的方…

C++上位软件通过LibModbus开源库和西门子S7-1200/S7-1500/S7-200 PLC进行ModbusTcp 和ModbusRTU 通信

前言 一直以来上位软件比如C等和西门子等其他品牌PLC之间的数据交换都是大家比较头疼的问题&#xff0c;尤其是C上位软件程序员。传统的方法一般有OPC、Socket 等&#xff0c;直到LibModbus 开源库出现后这种途径对程序袁来说又有了新的选择。 Modbus简介 Modbus特点 1 &#…

Navicat、Microsoft SQL Server Management Studio设置ID自增

一、Navicat中mysql数据库设置Id自增 &#xff08;1&#xff09;第一步 &#xff08;2&#xff09;第二步 二、Microsoft SQL Server Management Studio中Sqlservice数据库Id自增 &#xff08;1&#xff09;第一步 &#xff08;2&#xff09;第二步 &#xff08;3&#xff09…

RuoYi-Cloud-Plus使用minio进行文件上传图片后无法预览解决_修改minio配置minio桶权限---SpringCloud工作笔记198

在文件管理的位置,发现刚刚上传的图片文件,会显示 预览图片失败 后来经过多方查看,发现是minio的配置的问题 可以从这里: 可以看到首先登录RuoYi-Cloud-Plus系统然后,打开文件管理页面可以看到,当上传了图片文件以后 显示文件展示中,文件预览失败,那么这个时候,去修改minio的配…

element中Table表格控件实现单选功能、多选功能、两种分页方式

目录 1、Table表格控件实现单选功能2、Table控件和Pagination控件实现多选和两种分页方式方法一&#xff1a;使用slice方法方法二&#xff1a;多次调用接口 1、Table表格控件实现单选功能 <template><div><!-- highlight-current-row 是否要高亮当前行 -->…

IMU用于无人机故障诊断

最近&#xff0c;来自韩国的研究团队通过开发以IMU为中心的数据驱动诊断方法&#xff0c;旨在多旋翼飞行器可以自我评估其性能&#xff0c;即时识别和解决推进故障。该方法从单纯的常规目视检查跃升为复杂的诊断细微差别&#xff0c;标志着无人机维护的范式转变。 与依赖额外传…

Elasticsearch:如何使用 Elasticsearch 进行排序

虽然你在唱这首歌时可能会想象圣诞老人&#xff0c;但欧洲民间传说&#xff0c;尤其是阿尔卑斯地区的民间传说&#xff0c;有两个传奇人物圣尼古拉斯和坎普斯。 象征着慷慨和善良的圣尼古拉斯&#xff0c;在 12 月 6 日 为乖巧的孩子们带来礼物和欢乐&#xff01; 相比之下&…

ROS 传感器—相机的使用

在ROS中&#xff0c;相机作为一种重要的传感器设备被广泛应用于机器人视觉、导航定位、目标检测与识别等多种场景。 ROS提供了一系列工具和接口来支持不同类型的相机&#xff0c;包括USB摄像头、GigE Vision相机、FireWire相机以及深度相机&#xff08;如Kinect或Intel RealSe…

gRCP - 面向未来的第二代 RPC 技术,解析 HTTP2.0 和 Protobuf

目录 一、gRCP - 面向未来的第二代 RPC 技术 1.1、gRPC 简介 1.1.1、gRPC 是个啥&#xff1f; 1.1.2、gRPC 核心设计思路 1.1.3、gRPC 和 ThriftRPC 区别 1.1.4、为什么使用 gRPC&#xff1f;&#xff08;好处&#xff09; 1.2、HTTP2.0 协议 1.2.1、回顾 HTTP1.0 和 H…

LeetCode 2807. 在链表中插入最大公约数

给你一个链表的头 head &#xff0c;每个结点包含一个整数值。 在相邻结点之间&#xff0c;请你插入一个新的结点&#xff0c;结点值为这两个相邻结点值的 最大公约数 。 请你返回插入之后的链表。 两个数的 最大公约数 是可以被两个数字整除的最大正整数。 示例 1&#xf…

高防ip适合防御网站和游戏类的攻击吗?

​  作为站长&#xff0c;要学会并承受得住网站外来攻击的压力&#xff0c;尤其是所属为 DDoS 攻击高发行业的网站类业务及游戏行业&#xff0c;是很容易被竞争对手或者一些伪黑客爱好者盯上的。 加上&#xff0c;有些站长并没有提前了解&#xff0c;就盲目进军了这两个行业&…

imgaug库指南(一):从入门到精通的【图像增强】之旅

文章目录 引言imgaug简介安装和导入imgaug代码示例imgaug的强大之处和用途小结结尾 引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和…

关于“Python”的核心知识点整理大全59

目录 19.3.2 将数据关联到用户 1. 修改模型Topic models.py 2. 确定当前有哪些用户 3. 迁移数据库 注意 19.3.3 只允许用户访问自己的主题 views.py 19.3.4 保护用户的主题 views.py views.py 19.3.6 将新主题关联到当前用户 views.py 往期快速传送门&#x1f44…

鸿鹄工程项目管理系统源码:Spring Boot带来的快速开发与部署体验

随着企业规模的不断扩大和业务的快速发展&#xff0c;传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…

西电期末1017.有序序列插值

一.题目 二.分析与思路 简单题。主要考察简单的排序&#xff0c;最后的插入数据同样不用具体实现&#xff0c;只需在输出时多输出一下即可&#xff0c;注意顺序&#xff01;&#xff01; 三.代码实现 #include<bits/stdc.h>//万能头 int main() {int n;scanf("%d…

MySQL基础篇(一)SQL

视频地址: 黑马程序员 MySQL数据库入门到精通&#xff0c;从mysql安装到mysql高级、mysql优化全囊括 SQL&#xff0c;全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库统一 标准。 一、SQL通用语…

偏导函数公式以及使用 python 计算

偏导函数 偏导函数是多元函数对其中一个变量的偏导数。对于一个多元函数&#xff0c;其输入变量有两个或更多&#xff0c;而偏导函数则表示对其中一个变量的偏导数&#xff0c;将其他变量视为常数。 设有一个具有 n 个自变量的函数 f(,,...,)&#xff0c;则对于其中的某一个自…

ARM笔记-----输入捕获

输入捕获可以对输入的信号的上升沿、下降沿或者双边沿进行捕获&#xff0c;常用的有测量输入信号的脉 宽&#xff0c;和测量 PWM 输入信号的频率和占空比这两种。 输入捕获的大概的原理 当捕获到信号的跳变沿的时候&#xff0c;把计数器 CNT 的值锁存到捕获寄 存器 CCR 中…

彻底卸载 Microsoft Edge

如果您想学习如何在 Windows 10 上卸载 Microsoft Edge&#xff0c;您并不孤单。尽管目前基于 Chromium 的 Microsoft 浏览器版本比以前的 Edge 版本要好得多&#xff0c;但它仍然是一个不受欢迎的浏览器。 尽管您需要在 PC 上预装浏览器才能安装其他浏览器&#xff0c;但许多…

RK3568平台 input输入子系统

一.input子系统简介 Input 子系统是管理输入的子系统&#xff0c; 和 pinctrl 和 gpio 子系统一样&#xff0c; 都是 Linux 内核针对某一类设备而创建的框架。 input 子系统处理输入事务&#xff0c; 任何输入设备的驱动程序都可以通过 input 输入子系统提供的接口注册到内核&…