C++ Primer 一 变量和基本类型
本章讲解C++内置的数据类型(如:字符、整型、浮点数等)和自定义数据类型的机制。下一章讲解C++标准库里面定义的更加复杂的数据类型,比如可变长字符串和向量等。
1.基本内置类型
C++内置的基本类型包括:算术类型和空类型。算术类型值:字符、整型数、布尔值和浮点数;空类型对对应具体的值,仅用void表示用在一些特俗场合,比如函数不返回任何值时,就使用void作为返回类型。
1.1算术类型
算术类型分类整型和浮点型。
各算术类型在不同机器上表示的数字范围不一样,C++规定了最小取值范围,但最大没有规定。下面图表示各算术的类型的最小取值范围:
类型 | 含义 | 最小尺寸 |
---|---|---|
bool | 布尔类型 | 未定义 |
char | 字符 | 8位 |
wchar_t | 宽字符 | 16位 |
char16_t | Unicode字符 | 16位 |
char32_t | Unicode字符 | 32位 |
short | 短整型 | 16位 |
int | 整型 | 16位 |
long | 长整型 | 32位 |
long long | 长整型 | 64位 |
float | 单精度浮点数 | 6位有效数字 |
double | 双精度浮点数 | 10位有效数字 |
long double | 扩展精度浮点数 | 10位有效数字 |
其中:char的大小为一个字节,用于存放英语体系里面的任意字符;布尔类型的取值是真(true)或假(false);
内置类型的机器实现:
计算机按照二进制序列连续存储数据,每个bit非0即1,例如:
00001011110110101101011100001111......
只有将连续的一段bit规定为一个单位,二进制数据才有意义。C++规定,一个字节至少要能容纳机器中基本字符的所有字符。所以,一个字节有8位bit组成,一个字由32或64位bit组成。
由此,计算机中每8个bit使用1个地址,如下所示:
地址 数据 736424 1 0 1 0 0 1 1 0 736425 1 0 0 1 0 0 0 1 736426 1 1 1 0 1 1 1 0 736427 0 1 1 0 0 0 0 1 数据类型决定了某个具体数据所占的比特数以及这些比特位上数字的含义。
浮点型在C++中,被指定了最小有效位数,但是大多数编译器都实现了更高的精度。
1.2带符号类型和无符号类型
除布尔型和扩展的字符型以外,其他整型可以划分为带符号(signed)和无符号(unsigned)的两种类型。带符号类型可以表示正数、负数或0;无符号类型仅能表示正数或0,写法如下:
unsigned int、unsigned long、unsigned char。
如果int、short、long和long long没有表示是否带符号,则默认是带有符号的,可以表示负数。
注意:浮点型是不能用unsigned和signed修饰的。
C++在类型的规定上有如此多的类型和规定,就是为了尽可能接近硬件,满足各种硬件的特性,所以显得有些繁杂。
注意:
切勿混用带符号类型和无符号类型,否则发生错误,运算结果无意义。
1.3类型转换
数据类型的的定义,决定了能包含的数据范围和运算。但是当代码中值与数据类型不匹配时,C++会进行自动数据类型转换。
bool b = 42 // b为真
int i = b; // i的值为1
i = 3.14; // i的值为3
double pi = i; // pi的值为3.0
把非布尔值赋值给布尔类型,0表示false,非0表示true;
把布尔值赋值给非布尔类型,false表示0,true表示1;
浮点数赋值给整型,仅保留整数部分;
整数赋值给浮点数,小数部分为0。如果整数过大,超过浮点类型容量,真数据失真;
1.4字面值常量
每种数据类型的值,可以在程序中直接写出,被称作字面常量,比如:42。
每个字面常量都对应一种数据类型,其形式和值决定了它的数据类型。
-
整型和浮点型字面值
数字可以是十进制、八进制、十六进制,为了区分这几种字面常量的不同,八进制和十六进制需要加前缀符号0和0X、0x,如下:
20 十进制 024 八进制 0x24十六进制 0X24十六进制
数字的字面常量,C++会以数字的大小,找到最小限度能装下该字面常量的数据类型与之匹配。整型经常是int型,但int装不下时,可能是long型;浮点型经常默认是double型。
-
字符和字符串字面值
字符字面值由单引号括起来,且只能写一个字符,比如'C';
字符串字面值由双引号括起来,里面可以写很多字符,本质上是由每一个字符所组成的数组,并以空字符('\0')表示结尾。所以,即使字符串里面只有一个字符,比如“C”,依然长度是两个字符,字符'C'和空字符。
两个字符串字面值写在一起,哪怕中间有空白字符(空格符、缩进符、换行符),也被C++认为是一个字符串,所以当书写较长的字符串时,一行不合适,可以分为两个字符串放在两行。
-
转义序列
在字符串中,有两类字符不能直接使用,必须使用转义字符进行转义后才能使用。这两类字符是:
1.不可打印的字符,如退格、换行、空格或其它控制字符,因为没有可视化的符号;
2.在C++中有特殊含义的字符,如单引号、双引号、反斜杠、问号。
C++中转义字符如下:
换行符 \n | 问号 \? |
纵向制表符 \v | 进纸符 \f |
反斜杠 \\ | 报警符 \a |
回车 \r | 双引号 \" |
横向制表符 \t | 单引号 \' |
退格符 \b |
还有一种泛化的转义字符:格式1为:"\1到3个8进制数字";格式2为:“\x1到多个十六进制数字”,比如:
\7 响铃 \12 换行符 \40 空格 \0 空字符 \115 字符M \x4d 字符M
-
指定字面值的类型
通过给字面值加上指定前缀和后缀,可以强制规定字面值的数据类型;
前缀 | 含义 | 类型 |
---|---|---|
u | Unicode 16位字符 | chart16_t |
U | Unicode 32位字符 | chart32_t |
L | 宽字符 | wchar_t |
u8 | UTF-8(仅用于字符串字面常量) | char |
后缀 | 最小匹配类型 |
u 或者 U | unsigned |
l 或者 L | long |
ll 或者 LL | long long |
后缀 | 类型 |
f 或者 F | float |
l 或者 L | long double |
-
布尔字面值和指针字面值
布尔类型的字面值是:true和false;
指针字面值是:nullptr。
2.变量
变量是一个有名称的、可供程序操作的存储空间。C++中的每个变量都有其数据类型,数据类型决定了变量所占内存空间的大小和布局方式、能存储的值的范围,以及变量能够参与的运算规则。
2.1变量的定义
变量定义的基本格式是:
数据类型说明符 变量名1, 变量名2, 变量名3 ...... ;
int a = 0, b, c=0; // a 和 c初始化了,b仅仅只是定义了
-
初始值
当变量获取第一个值的时候,称为初始化。初始化的值可以是任意形式:字面值常量、表达式结果、函数返回值等。
一条语句中初始化多个变量,前面的变量可以马上为后面的变量初始化。
double a = 0.1, b = a; // a 和 b的值都是0.1
注意:
初始化不是赋值,初始化的含义是创建变量时规定一个最初的值,而赋值是把变量当前的值擦除,用一个新的值代替。二者在内存中的操作动作不一样。
- 列表初始化
在C++ 11中引入,用花括号或括号初始化变量,如下都是正确的:
// 以下变量值都是0
int a = 0;
int b = {0};
int c{0};
int d(0);
其中,花括号的形式逐渐流行,无论初始化还是赋值,都可以使用花括号。
-
默认初始化
如果定义变量时没有初始化,则变量被默认初始化,给赋予默认值。如果在函数体的变量没有初始化,则默认为0;如果在函数体内,如果变量没有初始化且没有赋值,则该变量值不可控,所以函数体内的变量一定要初始化或赋值。
2.2变量声明和定义的关系
C++可以把代码写在多个文件上,执行之前进行分别编译。如果要使用一个不在本文件中定义的变量,使用前需要声明,声明格式如下:
// 对外部变量的声明
extern 变量数据类型 变量名
变量只能被定义一次,但可以被声明多次,因为可以在不同文件中被使用。
变量声明、定义、初始化的区别:
- 声明:不分配存储空间,仅仅告诉该文件,这个变量使用了外部文件的变量;
- 定义:定义变量则分配了存储空间,但不一定有初值,即存储空间里不一定有具体的数据,但大多数情况,系统会进行默认值初始化。
- 初始化:不仅仅分配了存储空间,还给了一个具体的值。
// 声明要使用外部文件中的一个变量i;
extern int i; // 声明且定义了一个整型变量,并且,如果在函数体外则被默认初始化为0;
int j; // 声明和定义一个变量c,并显式初始化了一个值'A';
char c = 'A'; // 如果extern被显式初始化了一个值,则失去声明外部变量的作用,变得无意义
extern double s = 3.45533;
2.3 标识符
C++标识符的定义规则:由数字、字母或下划线组成,其中必须以字母或下划线开头。
标识符没有规定长度,但要区分大小写。
C++系统保留了一些标识符,我们在代码中不能使用这些标识符:
alignas | continue | friend | register | true |
alignof | decltype | goto | reinterpret_cast | try |
asm | default | if | return | typedef |
bool | delete | inline | short | typeid |
break | do | int | signed | union |
case | double | long | sizeof | unsigned |
catch | dynamic_cast | mutable | static | using |
char | else | namespace | static_assert | virtrual |
char16_t | enum | new | static_cast | void |
char32_t | explicit | noexcept | struct | volatile |
class | export | nullptr | switch | wchar_t |
const | extern | operator | template | while |
constexpr | false | private | this | and |
const_cast | float | protected | thread_local | and_eq |
auto | for | public | throw | bitand |
bitor | compl | not | not_eq | or |
or_eq | xor_eq | xor |
2.4 名字的作用域
在C++中所有标识符定义后,它都有自己的作用范围,如果出了它能表示的作用范围,该标识符是另外一个含义,这个范围就是作用域。
C++中大多数的作用域都使用了花括号分隔。
- 全局作用域:主函数名main定义于所有花括号之外,和其它大多数在函数体外的标识符一样,在整个程序范围内都可以使用。比如:全局作用域的变量叫全局变量,反之都叫局部变量。
- 块作用域:花括号内定义的标识符,只能在花括号内使用,在花括号外无效。
- 作用域的嵌套:作用域可以包含另一个作用域;外层作用域声明的变量可以在内层中使用,但,内层作用域可以重新定义这个变量,仅仅作用于内层作用域。
注意:
如果函数要使用全局变量,则函数体内最好不要再定义一个同名的局部变量,以防混淆。
3.复合类型
4.const限定符
5.处理类型
6.自定义数据结构
相关文章:
C++ Primer 一 变量和基本类型
本章讲解C内置的数据类型(如:字符、整型、浮点数等)和自定义数据类型的机制。下一章讲解C标准库里面定义的更加复杂的数据类型,比如可变长字符串和向量等。 1.基本内置类型 C内置的基本类型包括:算术类型和空类型。算…...

实体行业数字化转型怎么做?线上线下相结合的新零售体系怎么做?
如今,实体行业想要取得收入增长,只做线下业务或者只做线上业务,在当前的市场环境中是难以长久生存的,因此一定要线上线下相结合,将流量运作与线下转化进行充分结合,才能更好地发挥实体优势,带来…...

JAVA面经整理(5)
创建线程池不是说现用先创建,而是要是可以复用线程池中的线程,就很好地避免了大量用户态和内核态的交互,不需要频繁的创建和销毁线程 一)什么是池化技术?什么是线程池? 1)池化技术是提前准备好一些资源,在…...
【牛客网-面试必刷TOP101】二分查找题目
目录 二维数组中的查找_牛客题霸_牛客网 (nowcoder.com) 寻找峰值_牛客题霸_牛客网 (nowcoder.com) 数组中的逆序对_牛客题霸_牛客网 (nowcoder.com) 旋转数组的最小数字_牛客题霸_牛客网 (nowcoder.com) 二维数组中的查找_牛客题霸_牛客网 (nowcoder.com) 题意:…...

【QT】自定义组件ui类添加到主ui界面方法
1.添加自定义组件到项目中 add new选择如下 写好类方法,确定即可 2.将新创建的ui类加入到主ui界面 选中新创建ui类的父类空块,右键选择提升为 选择并添加新创建的类...
FFmpeg 多图片合成视频带字幕和音乐+特效(淡入淡出,圆圈黑色淡出)
FFmpeg 多图片合成视频带字幕和音乐+特效(淡入淡出,圆圈黑色淡出) 效果图1. 报错及解决2. xfade、xfade_opeccl 特效切换3. ffmpeg命令行详解4. 源码4.1 auto.bash4.2 geneFade.py4.3 python moviepy合并视频及音频按照(视频长度截取对应的音频在合并)4.4 命令行记录参考这…...

上网Tips: Linux截取动态效果图工具_byzanz
链接1 链接2 安装: sudo apt-get install byzanz 查看指令 说明 byzanz-record --help日常操作 xwininfo点击 待录制窗口 左上角 byzanz-record -x 72 -y 64 -w 1848 -h 893 -d 10 --delay5 -c /home/xixi/myGIF/test.gif小工具 获取鼠标坐标 xdotool getm…...

下载盗版网站视频并将.ts视频文件合并
. 1.分析视频请求123 2.数据获取和拼接 1.分析视频请求 1 通过抓包观察我们发现视频是由.ts文件拼接成的每一个.ts文件代表一小段2 通过观察0.ts和1.ts的url我们发现他们只有最后一段不同我们网上找到url获取的包3 我们发现index.m3u8中储存着所有的.ts文件名在拼接上前面固定…...

ElasticSearch - 基于 拼音分词器 和 IK分词器 模拟实现“百度”搜索框自动补全功能
目录 一、自动补全 1.1、效果说明 1.2、安装拼音分词器 1.3、自定义分词器 1.3.1、为什么要自定义分词器 1.3.2、分词器的构成 1.3.3、自定义分词器 1.3.4、面临的问题和解决办法 问题 解决方案 1.4、completion suggester 查询 1.4.1、基本概念和语法 1.4.2、示例…...
【kubernetes】kubernetes中的调度
1 调度过程 调度的本来含义是指决定某个任务交给某人来做的过程,kubernetes中的调度是指决定Pod在哪个Node上运行。 k8s的调度分为2个过程: 预选:去掉不满足条件的节点优选:对剩下符合条件的节点按照一些策略进行排序ÿ…...
java读取csv文件或者java读取字符串,找出引号内容,采用正则表达式书写
将一个csv文件复制出来将后缀改变为txt,我们就得到了一个文件文件打开这个txt文件,可以看到每一个字段之间都是用英文逗号隔开 正常的内容形似 20,C4,Pm,tem,tion,21,A4,E,H,"1,2,3,NA,aaa,bbbb,cccc,ddd,N/A,aaa,bbbb,cccc,ddd,tttttt对于这种我们只需要进行…...
【寻找关键钥匙】python实现-附ChatGPT解析
1.题目 寻找关键钥匙 知识点字符串、编程基础、正则表达式、排序 时间限制:1s 空间限制: 256MB 限定语言:不限 题目描述: 小强正在参加《密室逃生》游戏,当前关卡要求找到符合给定 密码K(升序的不重复小写字母组成)的箱子,并给出箱子编号,箱子编号为1~N。 每个箱子中都有一个…...

基于 QT 实现一个 Ikun 专属桌面宠物
Step0、实现思路 想到的思路有两种: 1、使用 QT 的状态机模式,参考官网文档,这个模式的解耦最佳 2、使用原生 Wigets,将窗口设置为透明无框,循环播放桌面宠物的状态 本文采用第二种思路,实现一个极简版…...

新闻报道的未来:自动化新闻生成与爬虫技术
概述 自动化新闻生成是一种利用自然语言处理和机器学习技术,从结构化数据中提取信息并生成新闻文章的方法。它可以实现大规模、高效、多样的新闻内容生产。然而,要实现自动化新闻生成,首先需要获取可靠的数据源。这就需要使用爬虫技术&#…...

C++ 并发编程实战 第八章 设计并发代码 二
目录 8.3 设计数据结构以提升多线程程序的性能 8.3.1 针对复杂操作的数据划分 8.3.2 其他数据结构的访问模式 8.4 设计并发代码时要额外考虑的因素 8.4.1 并行算法代码中的异常安全 8.4.2 可扩展性和Amdahl定律 8.4.3 利用多线程隐藏等待行为 8.4.4 借并发特性改进响应…...

list(链表)
文章目录 功能迭代器的分类sort函数(排序)merage(归并)unique(去重)removesplice(转移) 功能 这里没有“[]"的实现;原因:实现较麻烦;这里使用迭代器来实…...

使用代理IP进行安全高效的竞争情报收集,为企业赢得竞争优势
在激烈的市场竞争中,知己知彼方能百战百胜。竞争对手的信息对于企业来说至关重要,它提供了洞察竞争环境和市场的窗口。在这个信息时代,代理IP是一种实用的工具,可以帮助企业收集竞争对手的产品信息和营销活动数据,为企…...
【数学知识】一些数学知识,以供学习
矩阵的特征值和特征向量 https://zhuanlan.zhihu.com/p/104980382 矩阵的逆 https://zhuanlan.zhihu.com/p/163748569 对数似然方程(log-likelihood equation),简称“似然方程”: https://baike.baidu.com/item/%E5%AF%B9%E6%95%B0%E4%BC%BC%E7%84%B6%E6%96%B9%E7…...
JKChangeCapture swift 版本的捕捉属性变化的工具
在OC的时代里,大家捕捉属性的变化通常是通过KVO机制来实现的,KVO把所有的属性变化都放在了一个方法进行相应处理,并不友好,之前基于KVO的机制实现了一套属性变化工具JKKVOHelper,这里不就在过多介绍这个了,在swift的时…...

RISC-V 指令
RISC-V指令都是32位长。 文章目录 R-Type指令格式:I-Type指令格式:S-Type指令格式:B-Type指令格式:U-Type指令格式:UJ-Type指令格式:J-Type指令格式:R4-Type指令格式:F-Type指令格式:vC-Type指令格式:CB-Type指令格式:CIW-Type指令格式:CL-Type指令格式:R-Type指…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...