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 ./…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...