C++ Primer 第1章 开始
C++ Primer 第1章 开始
- 1.1 编写一个简单的C++程序
- 1.1.1 编译、运行程序
- 一、程序源文件命名约定
- 二、从命令行运行编译器
- 练习
- 1.2 初识输入输出
- 一、标准输入输出对象
- 二、一个使用IO库的程序
- 三、向流写入数据
- 四、使用标准库中的名字
- 五、从流读取数据
- 六、完成程序
- 1.3 注释简介
- 一、C++中注释的种类
- 二、注释界定符不能嵌套
- 1.4 控制流
- 1.4.1 while语句
- 1.4.2 for语句
- 练习
- 1.4.3 读取数量不定的输入数据
- 1.4.4 if语句
- 1.5 类简介
- 1.5.1 Sales_item类
- 一、读写Sales_item
- 二、Sales_item对象的加法
- 1.5.2 初识成员函数
- 一、什么是成员函数?
- 1.6 书店程序
- 小结
- 术语
1.1 编写一个简单的C++程序
每个C++程序都包含一个或多个函数,其中一个必须命名为main。操作系统通过调用main来运行C++程序。
// main函数的返回类型必须为int
int main()
{return 0; // 在大多数系统中,main的返回值被用来指示状态。返回值0表明成功,非0的返回值的含义由系统定义,通常用来指出错误类型
}
一个函数的定义包含四部分:
(1)返回类型
(2)函数名
(3)一个括号包围的形参列表(允许为空)
(4)函数体:以左花括号开始,以右花括号结束的语句块
1.1.1 编译、运行程序
一、程序源文件命名约定
源文件后缀:.cc、.cxx、.cpp、.cp、.C
二、从命令行运行编译器
// CC是编译器程序的名字,$是系统提示符
$ CC prog1.cc// 编译器生成一个可执行文件,Windows系统将可执行文件命名为prog1.exe,UNIX系统将可执行文件命名为a.out
// 在Windows系统中运行可执行文件
$ prog1 // 可忽略扩展名.exe
$ .\prog1 // "."后跟一个反斜线指出文件在当前目录中
// 在UNIX系统中运行可执行文件
$ a.out
$ ./a.out // "."后跟一个斜线来指出可执行文件位于当前目录中
// 访问main的返回值的方法依赖于系统
// 在UNIX和Windows系统中,执行完一个程序后,都可以通过echo命令获得其返回值
$ echo $? // UNIX
$ echo %ERRORLEVEL% // Windows
// 运行GNU编译器的命令是g++
$ g++ -o prog1 prog1.cc
// $是系统提示符
// -o prog1是编译器参数,指定了可执行文件的文件名。
// 在不同的操作系统中,此命令生成一个名为prog1(UNIX)或prog1.exe(Windows)的可执行文件
// 如果省略了-o prog1参数,在UNIX系统中编译器会生成一个名为a.out的可执行文件,在Windows系统中会生成一个名为a.exe的可执行文件
// 根据使用的GNU编译器的版本,可能需要指定-std=c++0x参数打开对C++11的支持// 运行微软Visual Studio编译器的命令为c1
C:\Users\me\Programs> c1 /EHsc prog1.cpp
// C:\Users\me\Programs>是系统提示符,Users\me\Programs是当前目录名
// 命令c1调用编译器,/EHsc是编译器选项,用来打开标准异常处理
// 微软编译器会自动生成一个可执行文件prog1.exe// 编译器通常都包含一些选项,能对有问题的程序结构发出警告。
// GNU编译器使用-Wall选项
// 微软编译器使用/W4
练习
Windows 7操作系统并不处理或报告程序返回的错误标识,直观上,返回-1的程序与返回0的程序在执行效果上并无不同。但环境变量ERRORLEVEL记录了上一个程序的返回值。因此,在控制台窗口执行修改后的程序,接着执行echo %ERRORLEVEL%,会输出-1。在Linux系统中,执行echo $?有类似效果。
1.2 初识输入输出
iostream库包含两个基础类型istream和ostream,分别表示输入流和输出流。
一、标准输入输出对象
1、标准输入:cin(istream类型对象)
2、标准输出:cout(ostream类型对象)
3、标准错误:cerr(ostream类型对象),输出警告和错误消息。默认情况下,写到cerr的数据是不缓冲的。
4、clog(ostream类型对象),输出程序运行时的一般性信息。默认情况下,写到clog的数据是被缓冲的。
系统通常将程序所运行的窗口与这些对象关联起来。当我们读取cin,数据将从程序正在运行的窗口读入,当我们向cout、cerr和clog写入数据时,将会写到同一个窗口。
二、一个使用IO库的程序
#include <iostream>int main()
{// <<输出运算符:左侧必须是ostream对象,右侧是要打印的值// 此运算符将给定的值写到给定的ostream对象中,输出运算符的计算结果就是其左侧运算对象// 前缀std::指出名字cout和endl是定义在名为std的命名空间中的std::cout << "Enter two numbers:" << std::endl;// 写入endl的效果是结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流int v1 = 0, v2 = 0;// >>输入运算符:左侧必须是istream对象,右侧为给定对象// 从给定的istream读入数据,并存到给定对象中,输入运算符返回其左侧运算对象作为其计算结果std::cin >> v1 >> v2;std::cout << "The sum of " << v1 << " and " << v2 << " is " << v1 + v2 << std::endl;return 0;
}
三、向流写入数据
在C++中,一个表达式产生一个计算结果,它由一个或多个运算对象和(通常是)一个运算符组成。
四、使用标准库中的名字
标准库定义的所有名字都在命名空间std中。
五、从流读取数据
六、完成程序
1.3 注释简介
一、C++中注释的种类
1、单行注释:以双斜线(//)开始,以换行符结束。
2、界定符对注释:以 /* 开始,以 */ 结束。当注释界定符跨越多行时,最好能显式指出其内部的程序行都属于多行注释的一部分,注释行的每行都以一个星号开头。
二、注释界定符不能嵌套
我们通常需要在调试期间注释掉一些代码。由于这些代码可能包含界定符对形式的注释,因此可能导致注释嵌套错误,因此最好的方式是用单行注释方式注释掉代码段的每一行。
1.4 控制流
1.4.1 while语句
// while语句反复执行一段代码,直至给定条件为假为止
// 求1到10这10个数之和
#include <iostream>int main()
{int sum = 0, val = 1;while (val <= 10) {sum += val;++val;}std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl;return 0;
}
1.4.2 for语句
#include <iostream>int main()
{int sum = 0;// 每个for语句都包含两部分:循环头和循环体// 循环头控制循环体的执行次数,它由三部分组成:初始化语句、循环条件、表达式for (int val = 1; val <= 10; ++val) {sum += val;}std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl;return 0;
}
练习
for循环与while循环对比:
在循环次数已知的情况下,for循环的形式更为简洁。
在循环次数无法预知时,用while循环实现更适合。用特定条件控制循环是否执行,循环体中执行的语句可能导致循环判定条件发生变化。
1.4.3 读取数量不定的输入数据
#include <iostream>int main()
{int sum = 0, value = 0;// while循环条件实际上检测的是std::cin// 当我们使用一个istream对象作为条件时,其效果是检测流的状态。// 如果流是有效的,即流未遇到错误,那么检测成功// 当遇到文件结束符,或遇到一个无效输入时(例如读入的值不是一个整数),istream对象的状态变为无效。处于无效状态的istream对象会使条件变为假while (std::cin >> value) {sum += value;}std::cout << "Sum is " << sum << std::endl;return 0;
}
当从键盘向程序输入数据时,对于如何指出文件结束,不同操作系统有不同的约定。在Windows系统中,输入文件结束符的方法是敲Ctrl+Z,然后按Enter或Return键。在UNIX系统中,包括Mac OS X系统中,文件结束符输入时用Ctrl+D。
1.4.4 if语句
#include <iostream>int main()
{int currVal = 0, val = 0;if (std::cin >> currVal) {int cnt = 1;while (std::cin >> val) {if (val == currVal) {++cnt;} else {std::cout << currVal << " occurs " << cnt << " times" << std::endl;currVal = val;cnt = 1;}}std::cout << currVal << " occurs " << cnt << " times " << std::endl;}return 0;
}
1.5 类简介
头文件后缀:.h、.H、.hpp、.hxx。标准库头文件不带后缀。
1.5.1 Sales_item类
类Sales_item的作者定义了类对象可以执行的所有动作。
一、读写Sales_item
#include <iostream>
#include "Sales_item.h"
// 用尖括号(<>)包围标准库头文件,用双引号("")包围不属于标准库的头文件int main()
{Sales_item book;std::cin >> book;std::cout << book << std::endl;return 0;
}
二、Sales_item对象的加法
#include <iostream>
#include "Sales_item.h"int main()
{Sales_item item1, item2;std::cin >> item1 >> item2;std::cout << item1 + item2 << std::endl;return 0;
}
使用文件重定向:允许我们将标准输入和标准输出与命名文件关联起来
$ addItems <infile> outfile
假定$是操作系统提示符,我们的加法程序已经编译为名为addItems.exe的可执行文件,则上述命令会从一个名为infile的文件读取销售记录,并将输出结果写入到一个名为outfile的文件中,两个文件都位于当前目录
1.5.2 初识成员函数
#include <iostream>
#include "Sales_item.h"int main()
{Sales_item item1, item2;std::cin >> item1 >> item2;if (item1.isbn() == item2.isbn()) {std::cout << item1 + item2 << std::endl;return 0; // 表示成功} else {std::cerr << "Data must refer to same ISBN" << std::endl;return -1; // 表示失败}
}
一、什么是成员函数?
成员函数是定义为类的一部分的函数,有时也被称为方法。
1.6 书店程序
#include <iostream>
#include "Sales_item.h"int main()
{Sales_item total;if (std::cin >> total) {Sales_item trans;while (std::cin >> trans) {if (total.isbn() == trans.isbn()) {total += trans;} else {std::cout << total << std::endl;total = trans;}}std::cout << total << std::endl;} else {std::cerr << "No data?!" << std::endl;return -1;}return 0;
}
小结
本章介绍了足够多的C++语言的知识,以使你能够编译、运行简单的C++程序。我们看到了如何定义一个main函数,它是操作系统执行你的程序的调用入口。我们还看到了如何定义变量,如何进行输入输出,以及编写if、for和while语句。本章最后介绍了C++中最基本的特性——类。在本章中,我们看到了,对于其他人定义的一个类,我们应该如何创建、使用其对象。在后续章节中,我们将介绍如何定义自己的类。
术语
1、缓冲区:一个存储区域,用于保存数据。IO设施通常将输入(或输出)数据保存在一个缓冲区中,读写缓冲区的动作与程序中的动作是无关的。我们可以显示地刷新输出缓冲,以便强制将缓冲区中的数据写入输出设备。默认情况下,读cin会刷新cout;程序非正常终止时也会刷新cout。
2、表达式:最小的计算单元。表达式求值会产生一个结果。
3、操纵符对象:如std::endl,在读写流的时候用来“操纵”流本身。
相关文章:
C++ Primer 第1章 开始
C Primer 第1章 开始 1.1 编写一个简单的C程序1.1.1 编译、运行程序一、程序源文件命名约定二、从命令行运行编译器 练习 1.2 初识输入输出一、标准输入输出对象二、一个使用IO库的程序三、向流写入数据四、使用标准库中的名字五、从流读取数据六、完成程序 1.3 注释简介一、C中…...
【STM32 学习】电源解析(VCC、VDD、VREF+、VBAT)
VCC电源电压GND电源供电负电压(通常接地)VDD模块工作正电压VSS模块工作负电压VREFADC参考正电压VREF-ADC参考负电压VBAT电池或其他电源供电VDDA模拟供电正电压VSSA模拟供电负电压 一、VCC(供电电压) VCC是指芯片的电源电压&#…...
C语言实例_解析GPS源数据
一、GPS数据格式介绍 GPS(全球定位系统)数据格式常见的是NMEA 0183格式,NMEA 0183格式是一种用于导航设备间传输数据的标准格式,定义了一套规范,使得不同厂商的设备可以通过串行通信接口(常见的是RS-232&a…...
LVS+Keepalived
Keepalived概述: keepalived软件 就是通过vrrp协议实现高可用功能 vrrp通信原理: vrrp就是虚拟路由冗余协议,它的出现就是为了解决静态路由的单点故障vrrp是通过一种竞选的一种协议机制将路由交给某台vrrp路由器vrrp用ip多播的方式【多播地…...
uni-app根据经纬度逆解析详细地址
uni-app中的getLocation()方法可以获取到用户当前的地理位置(经纬度)、速度。 但是返回参数中的address在app中才会显示,小程序中不会显示,所以我们需要进行逆解析其地址,解析出它的地址信息。 1.首先要在腾讯位置服务…...
【数据结构】吃透单链表!!!(详细解析~)
目录 前言:一.顺序表的缺陷 && 介绍链表1.顺序表的缺陷2.介绍链表(1)链表的概念(2)链表的结构(3)链表的功能 二.单链表的实现1.创建节点的结构2.头文件函数的声明3.函数的实现ÿ…...
Linux 安全技术和防火墙
目录 1 安全技术 2 防火墙 2.1 防火墙的分类 2.1.1 包过滤防火墙 2.1.2 应用层防火墙 3 Linux 防火墙的基本认识 3.1 iptables & netfilter 3.2 四表五链 4 iptables 4.2 数据包的常见控制类型 4.3 实际操作 4.3.1 加新的防火墙规则 4.3.2 查看规则表 4.3.…...
Mac 开发 Tang Nano FPGA 指南(使用终端和使用 VS Code 和插件,适用所有 Gowin FPGA)
最近收到了一个 Tang nano 9K FPGA开发板,就想借此机会研究一下。 官方文档里介绍如果想使用高云的 FPGA,就需要使用 GOWIN IDE,但是需要申请 license 提交一堆资料,我是别人送的就不太方便让别人弄。加上 IDE 其实并不是很适合学…...
基于深度学习的铁路异物侵限检测算法研究_整体认知感觉欠点意思,但是有一个新的变形卷积-Octave 卷积
相比于其他的交通运输方式,铁路运输具有准时性高、连续性强、速度快、运输量大、运输成本低以及安全可靠等优点。同时由于国家高速铁路网络建设的不断推进,铁路运输逐渐成为我国客运与货运的主要运输方式。虽然铁路运输为人们出行和货物运输带来的极大的…...
Spring项目使用Redis限制用户登录失败的次数以及暂时锁定用户登录权限
文章目录 背景环境代码实现0. 项目结构图(供参考)1. 数据库中的表(供参考)2. 依赖(pom.xml)3. 配置文件(application.yml)4. 配置文件(application-dev.yml)5…...
2023.8 - java - 变量类型
在Java语言中,所有的变量在使用前必须声明。声明变量的基本格式如下: type identifier [ value][, identifier [ value] ...] ; 格式说明: type -- 数据类型。identifier -- 是变量名,可以使用逗号 , 隔开来声明多个同类型变量…...
【Kubernetes】Kubernetes的Pod控制器
Pod控制器 一、Pod 控制器的概念1. Pod 控制器及其功用2. Pod 控制器有多种类型2.1 ReplicaSet2.2 Deployment2.3 DaemonSet2.4 StatefulSet2.5 Job2.6 Cronjob 3. Pod 与控制器之间的关系 二、Pod 控制器的使用1. Deployment2. SatefulSet2.1 为什么要有headless?2…...
Ubuntu20.04安装Nvidia显卡驱动教程
1、禁用nouveau 1、创建文件,如果没有下载vim编辑器,将vim换成gedit即可 $ sudo vim /etc/modprobe.d/blacklist-nouveau.conf 2、在文件中插入以下内容,将nouveau加入黑名单,默认不开启 blacklist nouveau options nouveau m…...
视频汇聚/视频云存储/视频监控管理平台EasyCVR添加萤石云设备详细操作来啦!
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...
AI 绘画Stable Diffusion 研究(十二)SD数字人制作工具SadTlaker插件安装教程
免责声明: 本案例所用安装包免费提供,无任何盈利目的。 大家好,我是风雨无阻。 想必大家经常看到,无论是在产品营销还是品牌推广时,很多人经常以数字人的方式来为自己创造财富。而市面上的数字人收费都比较昂贵,少则几…...
数据结构——链表详解
链表 文章目录 链表前言认识链表单链表结构图带头单循环链表结构图双向循环链表结构图带头双向循环链表结构图 链表特点 链表实现(带头双向循环链表实现)链表结构体(1) 新建头节点(2) 建立新节点(3)尾部插入节点(4)删除节点(5)头部插入节点(6) 头删节点(7) 寻找节点(8) pos位置…...
(学习笔记-进程管理)什么是悲观锁、乐观锁?
互斥锁与自旋锁 最底层的两种就是 [互斥锁和自旋锁],有很多高级的锁都是基于它们实现的。可以认为它们是各种锁的地基,所以我们必须清楚它们之间的区别和应用。 加锁的目的就是保证共享资源在任意时间内,只有一个线程访问,这样就…...
actuator/prometheus使用pushgateway上传jvm监控数据
场景 准备 prometheus已经部署pushgateway服务,访问{pushgateway.server:9091}可以看到面板 实现 基于springboot引入支持组件,版本可以 <!--监控检查--><dependency><groupId>org.springframework.boot</groupId><artifa…...
Linux设置临时目录路径的解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
19-普通组件的注册使用
普通组件的注册使用-局部注册 一. 组件注册的两种方式:1.局部注册:只能在注册的组件内使用 (1) 创建 vue 文件(单文件组件) (2) 在使用的组件内导入,并注册 components:{ 组件名: 组件对象 } // 导入需要注册的组件 import 组件对象 from.vue文件路径 import HmHeader from ./…...
别再让蜂鸣器只会‘哔哔’叫了!用STM32F103的PWM和电容,DIY你的家电提示音库(附超级玛丽彩蛋)
用STM32F103打造专业级家电提示音库:从单调蜂鸣到沉浸式音效的进阶指南 1. 为什么传统蜂鸣器音效总让人皱眉? 每次听到微波炉完成加热时刺耳的"嘀——"声,或是洗衣机结束运转时机械的"哔哔"提示,总让人有种想…...
如何高效管理Magpie窗口缩放插件:从安装到优化的完整指南
如何高效管理Magpie窗口缩放插件:从安装到优化的完整指南 【免费下载链接】Magpie An all-purpose window upscaler for Windows 10/11. 项目地址: https://gitcode.com/gh_mirrors/mag/Magpie Magpie作为一款强大的Windows窗口缩放工具,其插件系…...
FireRedASR-AED-L语音识别模型WebUI快速部署教程:Python环境一键配置
FireRedASR-AED-L语音识别模型WebUI快速部署教程:Python环境一键配置 语音识别技术正在快速融入我们的日常开发,无论是做智能客服、会议纪要,还是内容审核,一个好用的识别模型都能省下大量时间。但很多朋友在第一步——环境部署上…...
Python从入门到精通(第11章):函数进阶:作用域与闭包
Python从入门到精通(第11章):函数进阶:作用域与闭包 开头导语 这是本系列第11章。前面你已经掌握函数的基本定义和调用方式,这一章在此基础上向前一步,解决三个实际问题:变量名冲突时 Python 到…...
【大语言模型基础(2)】自注意力与多头机制:QKV、缩放与因果掩码
文章目录摘要1. 为什么需要自注意力2. Q、K、V 到底是什么一个具体例子3. Attention 公式在干什么第一步:计算相似度第二步:做缩放第三步:softmax\mathrm{softmax}softmax 归一化第四步:对 ValueValueValue 做加权平均4. 为什么 G…...
GPT-SoVITS实战体验:仅需1分钟音频,打造高保真个人语音库
GPT-SoVITS实战体验:仅需1分钟音频,打造高保真个人语音库 1. 引言:声音克隆技术的平民化革命 想象一下这样的场景:你录制了一段60秒的语音,几小时后就能听到AI用你的声音朗读任何文本——不仅音色相似度高达95%&…...
POV-RAY入门指南 - 从零开始掌握光线追踪(1)
1. 初识POV-Ray:光线追踪的艺术 第一次打开POV-Ray时,我被它生成的金属球反射效果震撼到了——桌面上那个虚拟球体竟然能精确反射出周围环境的每处细节,连窗框的倒影都清晰可见。这种基于物理的光线追踪技术,正是好莱坞大片特效的…...
NUS-WIDE数据集实战:从原始文件到多模态数据集的完整预处理指南
1. NUS-WIDE数据集简介与下载指南 NUS-WIDE是一个经典的多标签图像数据集,由新加坡国立大学的研究团队构建。这个数据集包含了269,648个样本和81个类别,每个样本可能同时属于多个类别(这就是多标签的含义)。数据集最初是为了研究网…...
MatLab实战:用移动最小二乘法(MLS)实现图像变形(附源码改进版)
MatLab实战:用移动最小二乘法(MLS)实现高精度图像变形 在数字图像处理领域,图像变形技术一直是个既基础又关键的课题。无论是影视特效中的角色变形,还是医学图像分析中的器官配准,甚至是工业检测中的零件对…...
AI驱动的Vue3应用开发平台深入探究(十):物料系统之内置组件库
内置组件库(Element Plus、Ant Design Vue、Vant) VTJ 通过其统一的物料系统架构,与三个流行的 Vue 组件库提供了全面的集成。这一抽象层使开发者能够利用熟悉的组件模式,同时保持低代码的可扩展性和跨库的可移植性。该系统将组件…...
