C++教程 - How to C++系列专栏第5篇
关于专栏
这个专栏是优质的C++教程专栏,如果你还没看过第0篇,点击这里去第0篇
本专栏一致使用操作系统:macOS Ventura,代码编辑器:CLion,C++编译器:Clang
感谢一路相伴的朋友们,感谢你们的支持 ^ _ ^
博主反馈非常及时,如果你在阅读的时候遇到问题,可以直接在评论区提问,博主看到后会在24小时内给你反馈
这两天出去旅游了没有及时更新,先向关注这个专栏的朋友道歉,但我们没有断更哦
C++教程 - How to C++系列专栏第5篇
目录
关于专栏
更新记录
2023年8月22日
前言
cin
cout语句的整合
函数
结语
快捷翻页
本文参考文章,书籍
更新记录
2023年8月22日
发布第一篇文章
前言
程序有了输出怎么输入?怎么把cout写的简洁一点?函数怎么写?
cin
下面我们可以来看一条程序,对前面的程序做了扩展,使用cin
#include <iostream>int main(void)
{using namespace std;int paper;cout << "How many pieces of paper do you have?" << endl;cin >> paper;paper = paper - 2;cout << "Blog time!";cout << endl;cout << "Now you have ";cout << paper;cout << " pieces of paper.";cout << endl;return 0;
}
下面是这段程序的示例输出:
How many pieces of paper do you have?
20
Blog time!
Now you have 18 pieces of paper.
这里我们可以看出键盘输入的信息“20”被传递给了paper变量,从cout中那里我们可以看出,实际上这个过程可以理解为键盘输入的数据流向了paper变量,显然,cin是一个输入流
cin属于iostream中的istream类中的一个对象
>>可以看作信息由大的一遍流入计算机,iostream把cin定义为了表示输出流的对象,需要在运算符右侧提供一个变量,用于接受输入的数据,在示例程序中,paper被设定为整数变量,传入数据会被转换为用于存储整数的形式
cout语句的整合
比如我们要输出:
Hello,I'm abcd
其中,abcd是需要用户的输入,那在此之前我们会这么写:
...cin >> in;
cout << "Hello I'm ";
cout << in;
cout << ".";
cout << endl;
这样很麻烦,还显得程序很难看,没有必要这么写对吗?
我们可以整合成这样:
...cin >> in
cout << "Hello I'm " << in << " ." << endl;
这样,原本要4行的输出被整合进了一行,还更漂亮是吗?
如果你喜欢分行,也可以这样
...cin >> in;
cout << "Hello I'm ";<< in;<< ".";<< endl;
函数
函数可以创建C++程序的模块,对C++对OOP至关重要,现在我们来简单讲讲函数的一些基本特征
有函数的返回值将会生成一个值,这个值可以赋予给变量或者其他表达式使用,比如希望使用sqrt()函数,并把返回值赋予给变量c1,那么我们就可以在代码中使用这样的语句:
...
c1 = sqrt(4)
...
这里将使用sqrt函数,包括函数调用的函数叫做调用函数,被语句调用的函数叫做被调用函数
圆括号中的值(这里是4)是要传递给函数的值,括号里的值被称为参数,计算的结果为2,这个值被放回给程序,这个值就被称为返回值
函数原型之于函数就像变量声明之于变量—指出涉及的类型
例如,C++库将sqrt()函数定义成将一个(可能)带小数部分的数字(如 6.25)作为参数,并返回一个相同类型的数字
有些语言将这种数字称为实数,但是C++将这种类型称为double(在之后我们会讲解)
sqrt()的函数原型像这样:
double sqrt(double);
第一个double意味着sqrt()将返回一个double值
括号中的double意味着sqrt()需要一个double参数
因此该原型对sqrt()的描述和下面代码中使用的函数相同:
double c1;
c1 = sqrt(4);
在程序中使用sqrt()时,也必须提供原型,可以用两种方法来实现
- 在源代码文件中输入函数原型
- 包含头文件cmath(老系统为math.h),其中定义了原型
在这里,更建议第二种方法,因为头文件更有可能使原型正确,对于C++库中的每个函数,都在一个或多个头文件中提供了其原型,可以通过手册或在线帮助查看函数描述来确定应使用哪个头文件
比如,sqrt()函数的说明将指出,应使用cmath头文件
千万不要混淆函数原型和函数定义
可以看出,原型只描述函数接口,也就是说,它描述的是发送给函数的信息和返回的信息,而定义中包含了函数的代码
比如计算平方根的代码,C和C++将库函数的这两项特性(原型和定义)分开了,库文件中包含了函数的编译代码,而头文件中则包含了原型
在首次使用函数之前要提供它的原型
通常的做法是把原型放到 main()函数定义的前面(前面我们使用头文件也可以把函数原型放到main()函数的前面),我们举个例子,下面的程序通过包含cmath文件来提供该函数的原型
#include <iostream>
#include <cmath>int main(void)
{using namespace std;double in;double out;cout << "This is a tool for measuring the side length of a square" << endl;cout << "Enter the area of the square:";cin >> in;out = sqrt(in);cout << "Its side length is " << out << "." << endl;return 0;
}
这是一个计算正方形边长的工具,下面是这个程序的输出
This is a tool for measuring the side length of a square
Enter the area of the square:16
Its side length is 4.
如果你使用的是很老的编译器,那么使用头文件方法应该使用
#include <math.h>
有些函数需要多项信息
这些函数使用多个参数,参数间用逗号分开
例如,数学函数pow()接受两个参数,返回值为以第一个参数为底,第二个参数为指数的幂
该函数的原型如下:
double pow(double, double);
比如要计算3的3次方,可以这么使用pow()函数
c1 = pow(3.0, 3.0);
有一些函数不接受任何参数,比如rand()函数,它的原型如下
int rand(void);
其中void表示它不接受任何参数,返回一个随机整数
可以这么使用这个函数
c1 = rand(void)
或者
c1 = rand()
省略void或者不省略效果是一样的
实际上main(void)函数也是不接受任何参数的,前面我们说过,这里不过多赘述
标准C库提供了140多个预定义的函数。如果其中的函数能满足要求,那么就可以使用它们。但用户经常需要编写自己的函数,尤其是在设计类的时候。无论如何,设计自己的函数很有意思,下面来介绍一下
其实前面已经使用过好几个我们自己定义的函数,它们就是main(),每个C++程序都必须有一个main()函数,用户必须对它进行定义
假设需要添加另一个用户定义的函数。和库函数一样,也可以通过函数名来调用用户定义的函数。对于库函数,在使用之前必须提供其原型,通常把原型放到main()定义之前。
但现在你必须提供新函数的源代码。最简单的方法是,将代码放在main()的后面,我们来举个例子
#include <iostream>
int conversion(double);int main(void)
{using namespace std;double length;cout << "This is a meter to centimeter conversion tool." << endl;cout << "Enter the length calculated using meters." << endl;cin >> length;conversion(length);return 0;
}int conversion(double accept)
{using namespace std;cout << "Converted to centimeters is " << accept * 100 << endl;
}
但是这种方法编译器会抛出编译警告
firstfunction.cpp:22:1: warning: non-void function does not return a value [-Wreturn-type]
}
^
1 warning generated.
意思是,又返回值的函数没有检测到返回值,虽然它可以正常运行,但我们最好改进一下
#include <iostream>
int conversion(double);int main(void)
{using namespace std;double length;double out;cout << "This is a meter to centimeter conversion tool." << endl;cout << "Enter the length calculated using meters." << endl;cin >> length;out = conversion(length);cout << "Converted to centimeters is " << out << "." << endl;return 0;
}int conversion(double accept)
{return accept * 100;
}
我们可以把运算结果作为返回值,然后赋值给变量out,这样就不会有编译警告了
下面是这段程序的示例输出:
This is a meter to centimeter conversion tool.
Enter the length calculated using meters.
1
Converted to centimeters is 100.
下一篇我们来细致讲解函数
结语
作者会经常帮助有问题的小伙伴解决问题
如果你有问题,可以直接到评论区指出,作者会在看到后到24小时内给予答复
如果本文有任何问题欢迎在评论去指出,如果喜欢这篇文章,希望能点赞评论关注
如果你们身边有像你提起过这个领域的,或者希望可以和ta一起进步的,把这篇文章分享给ta吧
4652字,9个父项,1个子项
快捷翻页
cout还是printf?C++教程 - How to C++系列专栏第4篇
C++教程 - How to C++系列专栏第3篇
C++教程 - How to C++系列专栏第2篇
C++教程 - How to C++系列专栏第1篇
C++教程 - How to C++系列专栏第0篇
本文参考文章,书籍
参考文章
C++中cin的详细用法_cin函数_大大大大大大旭的博客-CSDN博客
https://www.cnblogs.com/suozhiyuan/p/11932985.html
C++ 类 & 对象 | 菜鸟教程
pow函数的原型 以及使用pow函数需注意的坑!!_pow 原型_SSS迪的博客-CSDN博客
C++的POW()函数用法介绍,也即幂函数的使用方法_c++ pow 负数_Howe Tan浪漫的季节的博客-CSDN博客
sqrt()函数的详解和用法_辉小歌的博客-CSDN博客
文心一言
参考书籍
C++ Primer Plus
相关文章:
C++教程 - How to C++系列专栏第5篇
关于专栏 这个专栏是优质的C教程专栏,如果你还没看过第0篇,点击这里去第0篇 本专栏一致使用操作系统:macOS Ventura,代码编辑器:CLion,C编译器:Clang 感谢一路相伴的朋友们,感谢你…...

Vue2向Vue3过度核心技术插槽
目录 1 插槽-默认插槽1.作用2.需求3.问题4.插槽的基本语法5.代码示例6.总结 2 插槽-后备内容(默认值)1.问题2.插槽的后备内容3.语法4.效果5.代码示例 3 插槽-具名插槽1.需求2.具名插槽语法3.v-slot的简写4.总结 4 作用域插槽1.插槽分类2.作用3.场景4.使用…...
vite配置electron、ElementPlus或者AntDesignVue
这是全部的配置原文: import { defineConfig } from vite; import vue from vitejs/plugin-vue; import electron from "vite-plugin-electron"; import electronRenderer from "vite-plugin-electron-renderer"; import polyfillExports from…...

时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化
时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SVD分解重构算法,MATLAB程序,奇异值分解 (Singular Value Decompo…...
强化学习系列--时序差分学习方法(SARSA算法)
强化学习系列--时序差分学习方法(SARSA算法) 介绍示例代码 介绍 SARSA(State-Action-Reward-State-Action)是一种强化学习算法,用于解决马尔可夫决策过程(MDP)中的问题。SARSA算法属于基于值的…...

深度学习9:简单理解生成对抗网络原理
目录 生成算法 生成对抗网络(GAN) “生成”部分 “对抗性”部分 GAN如何运作? 培训GAN的技巧? GAN代码示例 如何改善GAN? 结论 生成算法 您可以将生成算法分组到三个桶中的一个: 鉴于标签&#…...

adb shell setprop 、开发者选项
App性能调试详解 Android App性能监控工具 更多系统属性参考 一、开启 GPU Render 的profiling bar: Gpu渲染速度 adb shell setprop debug.hwui.profile true adb shell setprop debug.hwui.profile visual_bars adb shell setprop debug.hwui.profile visual…...

性能测试面试问题,一周拿3个offer不嫌多
性能测试的三个核心原理是什么? 1.基于协议。性能测试的对象是网络分布式架构的软件,而网络分布式架构的核心是网络协议 2.多线程。人的大脑是单线程的,电脑的cpu是多线程的。性能测试就是利用多线程的技术模拟多用户去负载 3.模拟真实场景。…...
Android Bitmap压缩
Android View截屏长图拼接(RecyclerView) 我们在实际使用中,往往图片转化成Bitmap,对Bitmap操作的时候(如:截屏分享等),可能Bitmap会过大,导致无视实现对应功能。那么我们就需要对B…...

不同子网络中的通信过程
从输入www.baidu.com经历了什么 一、DNS(网址->IP) 二、ARP(IP->MAC) A->B:有数据发送,数据封装ip之后发现没有主机B的mac地址。然后ARP在本网段广播:检查目标地址和源地址是否在同一…...

Ubuntu Touch OTA-2 推出,支持 Fairphone 3 和 F(x)tec Pro1 X
导读UBports 基金会近日宣布为基于 Ubuntu 20.04 LTS (Focal Fossa) 的 Ubuntu Touch 移动操作系统发布并全面提供 OTA-2 软件更新。 Ubuntu Touch OTA-2 在首次 OTA 更新整整四个月后发布,支持新设备,包括 Fairphone 3、F(x)tec Pro1 X 和 Vollaphone X…...

【网络】数据链路层——MAC帧协议 | ARP协议
🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言:你只管努力,剩下的交给时间! 来到数据链路层后,完整的数据被叫做数据帧,习惯上称之为MAC帧。 MAC帧协议 | A…...
【Spring Boot】Spring Boot自动加载机制:简化应用程序的启动
在微服务盛行的今天,快速搭建和启动应用程序变得至关重要。Spring Boot作为Java生态系统中主流的框架,其自动加载机制使得开发者能够快速构建和启动应用程序。本文将详细介绍Spring Boot的自动加载机制,并通过代码示例加以说明。 首先&#…...

centos7搭建apache作为文件站后,其他人无法访问解决办法
在公司内网的一个虚拟机上搭建了httpsd服务,准备作为内部小伙伴们的文件站,但是搭建好之后发现别的小伙伴是无法访问我机器的。 于是寻找一下原因,排查步骤如下: 1.netstat -lnp 和 ps aux 先看下端口和 服务情况 发现均正常 2.…...

【开个空调】语音识别+红外发射
废话少说,直接上空调板子:YAPOF3。红外接收发射模块用的某宝上发现的YF-33(遗憾解码还没搞清楚,不然做个lirc.conf功能才多)。最后是语音识别用的幻尔的,某宝自然也有,它是个i2c的接口。 本篇胡说八道其实纯粹为了留个…...
【hibernate validator】(二)声明和验证Bean约束
首发博客地址 https://blog.zysicyj.top/ 一、声明bean约束 1. 字段级别约束 不支持静态类型字段 验证引擎直接访问实例变量,不会调用属性的访问器 在验证字节码增强的对象时,应适用属性级别约束,因为字节码增库无法通过反射确定字段访问 pac…...
Redis持久化机制之RDB,AOF与混合AOF
Redis是一款高性能的NoSQL数据库,它的速度非常快,同时也支持多种持久化机制,其中最常用的是RDB和AOF,还有一种混合AOF方式。那么这些持久化机制到底是什么,有什么不同呢? RDB是Redis默认的持久化方式&…...

为啥外卖小哥宁愿600一月租电动车,也不花2、3千买一辆送外卖!背后的原因......
大家好!我是菜哥! 又到周末了,我们聊点非技术的东西。最近知乎“为何那些穿梭于城市大街小巷的外卖小哥,宁愿每月掏出600块租一辆电动车,也不愿意掏出2、3千买一辆呢?” 冲上热榜! 听起来有点“…...

分布式定时任务框架Quartz总结和实践(2)—持久化到Mysql数据库
本文主要介绍分布式定时任务框架Quartz集成SpringBoot持久化数据到Mysql数据库的操作,上一篇文章使用Quartz创建定时任务都是保存在内存中,如果服务重启定时任务就会失效,所以Quartz官方也提供将定时任务等信息持久化到Mysql数据库的功能&…...
Linux 服务器搭建配置,开发效率一飞冲天 - Centos 篇
大家好,我是比特桃。最近白嫖了一台 Centos 云服务器,用来做日常开发,特此记录一下搭建配置的过程。 我之前有篇文章是基于 Ubuntu 的:Linux 服务器搭建配置,开发效率一飞冲天 - Ubuntu 篇 如同个人电脑一样࿰…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...