《Beginning C++20 From Novice to Professional》第二章Fundamental Types

本章将介绍C++的基础数据类型,主要涉及下列方面:

  • 变量的声明、初始化、赋值
  • 整数字面量
  • 浮点数如何计算
  • 变量类型转换
  • 字符相关
  • auto关键字

Variables, Data, and Data Types

这里先给出变量的定义:有名字的一块内存,这个变量的类型决定了程序如何解释这块内存,如何使用这块内存。并且类型由一系列关键字组成

基础变量分整型和浮点型两大类

Defining Integer Variables

要说明几点:

  1. 第九行只是声明,初始化由编译期完成,此处进行默认初始化(声明 ≠ 初始化)
  2. 初始化有三种形式,{},(),=,大多数情况下都没有区别
  3. {}会检查数据存不存在精度丢失的情况,如果存在narrowing conversion则报错

Signed Integer Types 有符号整型

这是书上给出的经典值(常见值),而标准只要求了最小大小(表里包含无符号整型):

表里每一小栏靠前的名字是更常用的,即short比short int常见

我们可以使用sizeof关键字查看类型所占字节数

Unsigned Integer Types 无符号整型

和对应的有符号类型占用相同的内存

书上提到char应当用来存储字符类型,用signed/unsigned char来存储数字,std::byte来存储二进制数据

char和signed char不是一种类型!这是整型里的例外!它的有符号性依赖于平台实现!

Fundamental types - cppreference.com

我们可以用limits里面的一个模板类来查看自己机器的char是不是有符号类型(取决于机器对数字的编码)

Zero Initialization

{}和{0}的初始化效果一样,都是使数值类型初始化为0,{}对所有基本数值类型都适用

Defining Variables with Fixed Values 定义常量

加个const即可

Integer Literals 整数字面量

Integer literal - cppreference.com

书上整理的没有cppref系统,这个不常见,用的时候查就可以了

需要知道常见的:u代表无符号,l/L代表long

'作为分割符可以增强数字可读性:


上面介绍了十进制的后缀,下面看看二进制、八进制和十六进制的写法

Calculations with Integers 整数运算

加减乘除加上取余:+-*/%

注意整数除法结果永远是整数,上图是除法和取余的对比

Assignment Operations 赋值操作

简单的等号不讲了,可以看看上面的复合赋值操作

Incrementing and Decrementing Integers 整数自增自减

前置后置的区别不再赘述,谨记一条,不要在一条语句中多次自增自减,宁愿写几行也不要带来歧义

Defining Floating-Point Variables 定义浮点变量

浮点数存储大多遵循IEEE754标准,但大多数情况下我们只用double,够大也够快

浮点数默认字面量也是double类型

Floating-Point Calculations 浮点数计算

Mathematical Constants 数学常数

用到再查吧

尝试输出了一下发现都是6位有效数字

Mathematical Functions 数学函数

用到再查,记得定义在<cmath>里

Invalid Floating-Point Results

主要是由于除数为0造成的无意义数

std::isinf() and std::isnan()可以帮助我们排错

Mixed Expressions and Type Conversion 混合表达式和类型转换

我们不能预知所有的数据类型,总会有不同类型的数值在同一个表达式中出现的时候,此时C++应用一套隐式的类型转换系统(整型提升Integral promotion)

Implicit conversions - cppreference.com

常见的类型排序一下如上表所示,当不同类型混合运算时,总会把等级低的类型转换成高等级类型后再进行运算,表中序号越小代表等级越高

经典的例子就是有无符号整数相加减:

The phenomenon where the result of a subtraction of unsigned integers wraps around to very large positive numbers is sometimes called underflow.

这里引入了下溢的概念,指的是无符号数的减法结果变成了非常大的正数,本质是无符号数无法存储负数,只能取余后循环到一个大正数(可以了解一下计组中数字的表示)

另外一个问题就是隐式类型转换,我们将double类型的z赋值给y后,y存储的值将是小数部分去掉后的z

我们知道有这么个机制即可,写代码时不应该依靠这种隐式转换,经常导致精度损失

不想出现这种情况的话,我们应该使用下面介绍的显式类型转换

Explicit Type Conversion 显式类型转换

static_cast<type_to_convert_to>(expression)

上面是cast的语法,又叫conversion,static_cast表明这种类型转换是在编译期处理的,所以我们可以预测后面还会介绍运行期的动态cast

上面是两处具体应用,在{}初始化里使用显式cast也不会报错了

std::round(), lround(), and llround() functions from <cmath>

这几个四舍五入的函数返回的结果都是整数

std::round, std::roundf, std::roundl, std::lround, std::lroundf, std::lroundl, std::llround, std::llroundf - cppreference.com

总之显式类型转换不应该出现太多,否则可能是选用的类型不对需要重新设计

Old-Style Casts 旧风格cast

(type_to_convert_to)expression

实际上还是很多见,语句比较短的时候还是可以用的

但是现代C++不推荐这种写法,语义不明确

Formatting Strings 字符串格式化

Formatting Stream Output 流输出格式化

这种方式是用来控制流的,即ostream,通过改变对象的状态来控制输出格式

<ios> and <iomanip>头文件里有控制符的一些函数

  1. std::hex (produces hexadecimal numbers)
  2. std::scientific (enables exponent notation for floatingpoint numbers)
  3. std::setw() (used to format tabular data)

在之前这个示例中,可以看到以下输出

但有时候我们不想要那么高的精度,我们尝试保留两位有效数字significant digits

但是C++20有更为轻量强大的方式std::format()来进行字符串的格式化

String Formatting with std::format()

但是精度好像更高了

这是因为format保证double最高有16位有效数字,当然我们也可以在大括号里对数据指定格式

Format Specifiers

格式控制说明符是参考python中的,Standard format specification - cppreference.com

具体用法可以参考:std::format() - 知乎

书里提到的简化说明:

如果写了不合法的格式控制,format将会抛出异常

我愿称之为C和Python杂交版本的printf,格式控制符是一个常用才能记住的东西,下面举一个例子看一下各种控制符的用法与效果

圈起来{:.2f}的原因是之前经常遇到小数点后保留几位数字的要求,这个和precision还不是一个概念,f代表fixed是固定小数点的意思

Formatting Tabular Data

深色字段表示用于表格化数据的输出控制:

width表示输出最小宽度,如果不够这个宽度将使用0或者字符进行补全(具体看数据类型);

align表示补全字符的插入位置是左右还是中间

对string, character, and Boolean默认对齐是靠左对齐

Formatting Numbers

我们可以指定符号、精度、输出进制等格式,还是来看一个例子:

Argument Indexes

冒号左边也有用,作为参数索引,指定参数输出的顺序

这个参数还可以用于一个数输出多次

Finding the Limits

直觉上我们用numeric_limits<type>::min()和numeric_limits<type>::max()来获取某种算术类型的最大最小值

但是浮点数中的min保存的是最小正数(因为IEEE754保存的精度有限),这里的最小指的是精度最大能够区分的最小,lowest()保存的才是最大的负数

这种情况在整数不存在

Finding Other Properties of Fundamental Types

这里是输出了一些无穷值和NAN

其他的可以去reference查

Working with Character Variables

The auto Keyword

值得注意的是不同版本的C++对于auto初始化有不同的解释,C++17之后只要不是初始化列表类型,都可以用大括号初始化,initializer_list需要用=初始化;之前的版本就不要用大括号初始化auto变量

EXERCISES

beginning-cpp20/Exercises/Modules/Chapter 02 at main · Apress/beginning-cpp20 · GitHub

官方答案可以看这里

2-1

对一些美国常用单位进行转换的小程序,1英尺=12英寸,要求输入英寸转换成英尺和英寸

2-2

2-4

计算BMI的小程序,只不过输入要求是英镑和英寸

2-5

意思是小数点后两位及以上的BMI是没有意义的精度,保留一位即可,想到之前的format里有f控制符

2-6

复现表格2-6

2-7

在上一题的表格中加一行sin(pi/4),要求使用科学记数法表示,且小数点后保留五位,指数的e还要大写

2-8

比较两个正数的大小但是不用第五章的条件语句,仅使用本章的运算符即可实现

这我也是看答案的,当x>y时y/x为0而x/y不为0,这是核心思路

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2982309.html

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

相关文章

2024-04-23 linux 查看内存占用情况的命令free -h和cat /proc/meminfo

一、要查看 Linux 系统中的内存占用大小&#xff0c;可以使用 free 命令或者 top 命令。下面是这两个命令的简要说明&#xff1a; 使用 free 命令&#xff1a; free -h这将显示系统当前的内存使用情况&#xff0c;包括总内存、已用内存、空闲内存以及缓冲区和缓存的使用情况。…

想冲宇宙厂,直接挂了。。。

宇宙厂实际是字节&#xff0c;这个称呼是因为字节跳动主宰了宇宙内一切App&#xff0c;有点家大业大的意思。 今天分享一位字节春招凉经&#xff0c;问了一些数据库和Java八股&#xff0c;没出算法题&#xff0c;直接挂了&#xff0c;竟然最喜欢出算法题的字节&#xff0c;这次…

c++ - 空间申请和释放 new/delete

文章目录 一、c/c内存分布二、new/delete 的使用三、malloc/free 和 new/delete 的对比四、new/delete 的实现原理五、匹配问题 一、c/c内存分布 求下面各个变量的位置 // c/c内存分布int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar …

前端零代码开发实践:页面嵌套+逻辑连线0开发扩展组件,实现切换开关控制扇叶转动。能无代码封装扩展组件,有别于常规的web组态或低代码平台

前言&#xff1a; 官网:http://www.uiotos.net/ 什么是 UIOTOS&#xff1f; 这是一款拥有独创专利技术的前端零代码工具&#xff0c;专注于解决前端界面开发定制难题&#xff0c;原型即应用&#xff01;具有页面嵌套、属性继承、节点连线等全新特性&#xff0c;学习门槛低…

敷尔佳2023年报前瞻:“医美面膜第一股”的护城河及2024展望

查理芒格曾说&#xff1a;“要去鱼多的地方打渔”。历数长线牛股辈出的领域&#xff0c;消费行业无疑是大赢家。此中&#xff0c;美业又是消费行业最好的细分赛道之一。 4月26日&#xff0c;A股“医美面膜第一股”–敷尔佳(SZ:301371)将发布2023年财报&#xff0c;按惯例对本季…

ros2_control【B站WMGIII教学学习记录】1

资源 https://www.bilibili.com/video/BV1ku411G7UR? 学习过程中存在bug&#xff0c;记录一下 1 Q:"package ‘joint_state_publisher_gui’ not found, searching: [/home A: sudo apt install ros-humble-joint-state-publisher2 https://fishros.org.cn/forum/to…

蓄能勃发,酷开科技携酷开系统“软硬结合”提升大屏实力

智慧大屏以全新媒体形态之姿在过去几年快速增长&#xff0c;截至去年上半年&#xff0c;国内联网电视总量覆盖达5.26亿&#xff0c;其中智能电视终端活跃量达3.22亿&#xff0c;在PC、Mobile流量增长已显疲态的背景下&#xff0c;大屏的高速发展意味着一个新的赛道的崛起&#…

保护你的网站:了解5种常见网络攻击类型及其防御方法

随着互联网的迅猛发展&#xff0c;针对网站的各种类型的网络攻击随之增加&#xff0c;网络攻击事件层出不穷&#xff0c;由此&#xff0c;如何保护网站安全成为每个网站所有者的重要议题。在下面的内容中&#xff0c;我们将探讨5种常见网络攻击类型及其防御方法&#xff0c;以帮…

Linux中手工创建一个用户

当我们需要新创建一个用户时&#xff0c;有两种方法 1&#xff0c;使用useradd命令&#xff1a; [rootlocalhost /]# useradd tmg 然后给它设置一个密码 [rootlocalhost etc]# passwd tmg Changing password for user tmg. New password: BAD PASSWORD: The password is a…

C++ | Leetcode C++题解之第46题全排列

题目&#xff1a; 题解&#xff1a; class Solution { public:void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){// 所有数都填完了if (first len) {res.emplace_back(output);return;}for (int i first; i &…

【大语言模型LLM】-基础语言模型和指令微调的语言模型

&#x1f525;博客主页&#xff1a;西瓜WiFi &#x1f3a5;系列专栏&#xff1a;《大语言模型》 很多非常有趣的模型&#xff0c;值得收藏&#xff0c;满足大家的收集癖&#xff01; 如果觉得有用&#xff0c;请三连&#x1f44d;⭐❤️&#xff0c;谢谢&#xff01; 长期不…

【古琴】倪诗韵古琴雷修系列(形制挺多的)

雷音系列雷修&#xff1a;“修”字取意善、美好的&#xff0c;更有“使之完美”之意。精品桐木或普通杉木制&#xff0c;栗壳色&#xff0c;纯鹿角霜生漆工艺。 方形龙池凤沼。红木配件&#xff0c;龙池上方有“倪诗韵”亲笔签名&#xff0c;凤沼下方&#xff0c;雁足上方居中位…

微软开源phi-3-mini体验地址;将你的想法转换成代码,并从中构建出代码原型jemma

✨ 1: Lumina-T2X 基于文本的多功能生成模型 Lumina-T2X 是一种基于文本的多功能生成模型&#xff0c;能够根据文字指令&#xff0c;将噪声数据转化为图片、视频、3D对象的多视图图片以及语音。这个技术利用一种被称为流式大扩散变换器&#xff08;Flow-based Large Diffusio…

2024的新宠儿——Mamba(1):SSM

引言 自 2017 年被提出以来,Transformer 已经成为 AI 大模型的主流架构,但随着模型规模的扩展和需要处理的序列不断变长,Transformer 的局限性也逐渐凸显。一个很明显的缺陷是:Transformer 模型中自注意力机制的计算量会随着上下文长度的增加呈平方级增长,比如上下文增加 …

linux autogroup

一&#xff1a;概述 对于linux autogroup的作用&#xff0c;很多同学可能是听说过&#xff0c;但&#xff0c;并未验证过。 考虑下面场景&#xff0c;开两个terminal&#xff0c;T1和T2&#xff0c;在T1中运行进程P1&#xff0c;P1开启9个线程编译代码&#xff0c;在T2中运行…

uniapp引入uniapp打包的H5跳转H5以及H5返回app方法

在app项目添加webview文件夹添加gridWebview.vue文件。代码如下 <template><view><web-view :src"src" message"getMessage" ></web-view></view> </template><script>export default {data() {return {src: ,…

Python中pyside2出现的pyside2 qt platform plugin could be in错误及其解决方法

系统平台&#xff1a;Win10 64bit python版本&#xff1a; python 3.8 使用pip install pyside2安装 pyside2 这是找不到QT平台的插件&#xff0c;这是环境变量QT_QPA_PLATFORM_PLUGIN_PATH出现错误 具体解决方法&#xff1a; 我们可以在每一段程序开始之前设定环境变量&…

设备需要支持GMS,Rockchip芯片,写入Attestation key方法 Google 申请keybox 检查是否已经写入Attestation key

写入Attestation key方法 首先通过3PL向谷歌申请Google keybox&#xff0c;拿到keybox后使用瑞芯微提供的打包工具 rkpacker打包成烧写的格式&#xff0c;再使用工具烧写到设备中&#xff0c;相关的工具在工程目录 1、申请Google keybox 比如test_keybox.xml 2、打包工具Lin…

MySQL多版本并发控制mvcc原理浅析

文章目录 1.mvcc简介1.1mvcc定义1.2mvcc解决的问题1.3当前读与快照读 2.mvcc原理2.1隐藏字段2.2版本链2.3ReadView2.4读视图生成原则 3.rc和rr隔离级别下mvcc的不同 1.mvcc简介 1.1mvcc定义 mvcc(Multi Version Concurrency Control)&#xff0c;多版本并发控制&#xff0c;是…

uniapp实现点击事件跳转页面

首先定义一个点击事件 这里采用的vue3的写法&#xff0c;然后写上触发事件后要跳转的路径 function jump() {uni.switchTab({url:/pages/bangong/index})} 到这里就简单的实现uniapp的点击跳转页面了