《C++ Primer》第2章 变量(一)

参考资料:

  • 《C++ Primer》第5版
  • 《C++ Primer 习题集》第5版

2.1 基本内置类型(P30)

C++ 定义的基本类型包括算术类型(arithmetic type)和空类型(void),其中算术类型包括字符、整型、布尔值和浮点数。

2.1.1 算术类型(P30)

算术类型分为整型(包括字符、布尔值)和浮点型。

Screenshot_20230904_192850

char 类型实际上会表现为 signed charunsigned char ,具体是哪种由编译器决定。

如何选择类型?

  • 数值不可能为负时,选用无符号类型。
  • 默认使用 int 进行整型运算,使用 double 进行浮点型运算。

2.1.2 类型转换(P32)

常见的类型转换:

  • 非布尔算数值赋给布尔类型时,初始值为 0 则结果为 false ,否则结果为 true ;把布尔类型赋值给非布尔类型时,初始值为 false 则结果为 0 ,初始值为 true 则结果为 1 。
  • 把浮点数赋值给整型,仅保留小数点前的部分;把整型赋值给浮点数,小数部分记为 0 。
  • 当赋给无符号类型超过其表示范围的值时,其实际结果要取模;当赋给有符号类型超过其表示范围的值时,其结果未定义

由于 C++ 并未对 int 类型的尺寸做出规定,所以我们不应把 int 的尺寸看作一个固定值。

当无符号类型和有符号类型混用时,一般会将有符号类型转换为无符号类型

这部分最好结合数的机器表示、补码等知识进行理解。

2.1.3 字面值常量

整型字面量默认为十进制带符号数,特别地,以 0 开头的整型字面量代表八进制数,以 0x0X 开头的整型字面量代表十六进制数。八进制和十六进制字面值可能是带符号的,也可能是无符号的。

20 /* 十进制 */    024 /* 八进制 */    0x14 /* 十六进制 */

严格地说,字面值不会是负数,形如 -42 的字面值应看作对字面值 42 取负值。

浮点字面值:

3.14    3.14e0    0.    0E0    .001 

由单引号括起来的单个字符为 char 型字面值,双引号括起来的字符为字符串型字面值。字符串以空字符结尾(‘\0’)。

如果两个字符串型字面值位置紧邻或仅由空格、缩进和换行符分隔时,则它们实际上是一个整体

// 多行书写
cout << "hello""world";

泛化的转义序列:\x 后紧跟若干十六进制数字,\ 后紧跟 1~3 个八进制数字:

\12 (换行符)    \xc (换行符)

指定字面值的类型:

Screenshot_20230904_203601

练习

int month = 09;	// 编译报错
double d = 1024f;	// 编译报错,因为1024为整型字面量,不能有f后缀

2.2 变量(P38)

变量提供一个有名字的、可操作存储空间,其数据类型决定占用空间的大小、布局方式、值的范围、能参与的运算类型。

2.2.1 变量定义(P38)

变量定义的基本形式:类型说明符,随后紧跟一个或多个变量名(用逗号分隔)。

int a = 0, b, c = 0;
int a = b = 1;	// 错误

初始化

当变量再创建时获得了初值,就称这个变量被初始化了。用于变量初始化的值可以是任意复杂的表达式

在 C++11 后,允许统一用花括号初始化变量:

int a{0};
int b[4]{1, 2, 3, 4};

这种初始化方式会在初值存在丢失信息的风险时进行报错。

默认初始化

对内置类型的变量,如果在函数体外定义,则初始化为 0 ;如果在函数体内定义,则不会被初始化,未被初始化的变量的值是未定义的。

绝大多数类无须显示初始化,这样的类提供了一个合适的默认值,如 string 类默认空串。

2.2.2 变量声明和定义的关系(P41)

变量声明的作用是告诉编译器某个实体的存在;定义的作用是在程序中为实体分配内存。

定义变量的同时也就声明了这个变量,如果仅仅想要声明一个变量,要使用 extern 关键字,并且不能显式初始化。

变量只能被定义一次,可以被声明多次。

2.2.3 标识符(P43)

2.2.4 名字的作用域(P43)

程序中的每个名字都会指向一个特定的实体。

作用域是程序的一部分,大部分作用域用花括号分隔。

名字的有效区域始于名字的声明语句,结束于声明语句所在的作用域末端

作用域能够嵌套,内层作用域能够访问外层作用域的名字,也能重新定义外层作用域已有的名字。

2.3 复合类型(P45)

声明语句的通用描述:一条声明语句由一个基本数据类型和紧随其后的一个声明符(declarator)列表组成。每个声明符命名了一个变量并指定该变量为与基本数据类型有关某种类型

2.3.1 引用(P45)

引用(reference)为对象起了一个别名,引用并非对象,也无法令引用重新绑定对象,因此引用必须被初始化

int a = 0;
int &b = a;

对引用的所有操作都是在与之绑定的对象上进行的。由于引用本身并不是对象,所以不能对引用进行引用。

一般情况下,引用的类型必须和绑定的对象严格匹配,且只能绑定在对象上。

2.3.2 指针(P47)

指针是指向另一种类型的复合类型,指针本身是一个对象,允许赋值和拷贝,无须在定义时赋初值。

获取对象的地址

取地址符 &

由于引用不是对象,所以不能定义指向引用的指针。

一般而言,指针的类型要和指向的对象严格匹配。

指针值

指针的值是有效的,当且仅当以下情况:

  • 指向一个对象

  • 指向紧邻对象所占空间的下一个位置

    可以用来判断是否越界

  • 空指针

利用指针访问对象

如果指针指向了一个对象,则可以使用解引用符 * 来访问该对象。对指针解引用会得到指针指向的对象。

空指针

int *p1 = nullptr;
int *p2 = 0;
int *p3 = NULL;

nullptr 是一种特殊类型的字面值,可以被转换成任意类型的指针类型。NULL 是一种预处理变量,会被预处理器处理为 0 。新标准下最好使用 nullptr 并避免使用 NULL

int *p = 0x12345678;    //错误,因为0x12345678会被当成int型字面量

赋值和指针

赋值永远改变的是等号左边的对象

其他指针操作

指针可以用在条件表达式中;两个相同类型的指针可以比较

void* 指针

void* 指针是一种特殊的指针,可以存放任意对象的地址。我们不能直接操作 void* 指针所指向的对象。

练习

2.23 给定指针 p ,可以判断它是否指向了一个合法的对象吗?

答:个人感觉其实不可以的。首先,我们无法确定指针 p 是否有效。再者,即使 p 有效,它仍有可能是指向紧邻某对象的下一个位置。

2.3.3 理解复合类型的声明(P51)

在同一条定义语句中,基本数据类型只有一个,但声明符的形式可以有很多:

int *p, a = 0, &b = a;

指向指针的引用

int i = 0;
int *p = &i;
int *&a = p;

要理解变量 a 的类型,我们可以从右向左阅读 a 的定义,与 a 紧邻的符号(&)对 a 有最直接的影响,所以 a 是一个引用,声明符的其余部分确定了 a 引用的类型。所以,aint 指针的引用。

int *p, a = 0, &b = a;


### 指向指针的引用```cpp
int i = 0;
int *p = &i;
int *&a = p;

要理解变量 a 的类型,我们可以从右向左阅读 a 的定义,与 a 紧邻的符号(&)对 a 有最直接的影响,所以 a 是一个引用,声明符的其余部分确定了 a 引用的类型。所以,aint 指针的引用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux CentOS7 awk的反转功能

处理文本文件&#xff0c;经常会遇到反向输出的要求。 可用命令rev对待处理的文件或标准输入快速完成。 可用命令tac对文件快速完成反向查看。 而对行中字符串(单词)可借助其他命令达到反向输出的目标。 我们在文章《Linux CentOS7sed的替换及逆转功能》讨论了sed流编辑器对…

学习Bootstrap 5的第五天

目录 图像 图像形状 实例 对齐图像 实例 居中图像 实例 响应式图像 实例 Jumbotron 实例 图像 图像形状 .rounded 类可以用于为图像或任何具有边框的元素添加圆角。这个类适用于Bootstrap的所有版本&#xff0c;并且在最新版本中得到了进一步的增强。 实例 <…

CS420 课程笔记 P6 - 游戏逆向中的虚拟内存

文章目录 IntroVirtual memoryExample!Static example Intro 在上个视频中&#xff0c;我们知道有些地址在你重进游戏时就会无效&#xff0c;有的有时有效&#xff0c;我们需要了解称为虚拟内存的东西 记住这些信息&#xff1a;当你双击打开 Squally.exe 游戏时&#xff0c;系…

C# winform控件和对象双向数据绑定

实现目的&#xff1a; 控件和对象双向数据绑定 实现结果&#xff1a; 1. 对象值 -> 控件值 2. 控件值 -> 对象值 using System; using System.Windows.Forms;namespace ControlDataBind {public partial class MainForm : Form{People people new People();public Mai…

JVM的故事——虚拟机类加载机制

虚拟机类加载机制 文章目录 虚拟机类加载机制一、概述二、类加载的时机三、类加载的过程四、类加载器 一、概述 本章将要讲解class文件如何进入虚拟机以及虚拟机如何处理这些class文件。Java虚拟机把class文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#…

KMP超高效匹配算法

简介&#xff1a; KMP算法是一种改进的字符串匹配算法&#xff0c;其中&#xff0c;KMP算法的运用核心是利用匹配失败后的信息&#xff0c;最大进度的减少模式串与目标串的匹配次数以达到快速匹配的效果。算法与暴力求解的改进在于每当一趟匹配过程中出现的字符比较不相等时&am…

2023开学礼中国海洋大学《乡村振兴战略下传统村落文化旅游设计》许少辉新海洋图书馆

2023开学礼中国海洋大学《乡村振兴战略下传统村落文化旅游设计》许少辉新海洋图书馆

SOME/IP TTL 在各种Entry 中各是什么意思?有什么限制?

1 服务发现 SOME/IP SD 服务发现主要用于 定位服务实例检测服务实例状态是否在运行发布/订阅行为管理SOME/IP SD 也是 SOME/IP 消息,遵循 SOME/IP 消息格式,有固定的 Message ID、Request ID 以及 Message Type 等。并对 SOME/IP Payload 进行了详细的定义。 SOME/IP SD …

面试中的自我介绍:首印象决定一切

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

C语言基础之——结构体

前言&#xff1a;小伙伴们又见面啦&#xff0c;那么本篇文章&#xff0c;我们就将对C语言基础知识的最后一个章节——结构体展开讲解。 世上无难事&#xff0c;只要肯攀登&#xff01; 目录 一.什么是结构体 二.结构体讲解 1.结构体的声明和变量的定义 2.结构体成员的类型…

【Linux】多线程2——线程互斥与同步/多线程应用

文章目录 1. 线程互斥1.1 问题引入1.2 线程互斥的相关概念1.3 互斥量mutex1.4 互斥量实现原理1.5 死锁 2. 线程安全和可重入函数3. 线程同步3.1 同步概念3.2 条件变量 4. 生产消费模型4.1 基于阻塞队列的cp模型4.2 基于环形队列的cp模型POSIX信号量 5. 线程池5.1 互斥量RAII版本…

二叉树的介绍

写在前面&#xff1a; 二叉树是数据结构课程中非常重要的内容&#xff0c;我们针对二叉树的概念、性质以及类型展开详细介绍。 一、概念 二叉树&#xff08;Binary Tree&#xff09;是n&#xff08;n>0&#xff09;个结点的有限集合&#xff0c;该集合或者空集&#xff0…

英语之美:用一句话解释句子结构

以下是一个包含主语、谓语、宾语、表语、定语、同位语、补足语和状语的扩展句子&#xff0c;使用 “I love you” 作为基础&#xff1a; “I, the person who truly loves you, consider our love a beautiful gift, and I love you more deeply with each passing day.” 在…

Android开机动画

Android开机动画 1、BootLoader开机图片2、Kernel开机图片3、系统启动时&#xff08;BootAnimation&#xff09;动画3.1 bootanimation.zip位置3.2 bootanimation启动3.3 SurfaceFlinger启动bootanimation3.4 播放开机动画playAnimation3.6 开机动画退出检测3.7 简易时序图 4、…

【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解

前面我们介绍了K8SDockerMaven插件打包部署SpringCloud微服务项目&#xff0c;在实际应用过程中&#xff0c;很多项目没有用到K8S和微服务&#xff0c;但是用到了Docker和SpringBoot&#xff0c;所以&#xff0c;我们这边介绍&#xff0c;如果使用Jenkinsjib-maven-plugin插件打…

基于springboot实现websocket实时通讯启动项目报错

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

MySQL之事务与引擎

目录 一、事物 1、事务的概念 2、事务的ACID特点 3、事务之间的相互影响 4、Mysql及事务隔离级别(四种) 1、查询会话事务隔离级别 2、查询会话事务隔离级别 3、设置全局事务隔离级别 4、设置会话事务隔离级别 5、事务控制语句 6、演示 1、测试提交事务 2、测试事务回滚 4…

鲁棒优化入门(7)—Matlab+Yalmip两阶段鲁棒优化通用编程指南(下)

0.引言 上一篇博客介绍了使用Yalmip工具箱求解单阶段鲁棒优化的方法。这篇文章将和大家一起继续研究如何使用Yalmip工具箱求解两阶段鲁棒优化(默认看到这篇博客时已经有一定的基础了&#xff0c;如果没有可以看看我专栏里的其他文章)。关于两阶段鲁棒优化与列与约束生成算法的原…

【数学建模竞赛】数据预处理知识总结1——数据清洗

数据预处理是什么 在数学建模赛题中&#xff0c;官方给所有参赛选手的数据可能受到主观或客观条件的影响有一定的问题&#xff0c;如果不进行数据的处理而直接使用的话可能对最终的结果造成一定的影响&#xff0c;因此为了保证数据的真实性和建模结果的可靠性&#xff0c;需要…

SpringBoot v2.7.x+ 整合Swagger3入坑记?

目录 一、依赖 二、集成Swagger Java Config 三、配置完毕 四、解决方案 彩蛋 想尝鲜&#xff0c;坑也多&#xff0c;一起入个坑~ 一、依赖 SpringBoot版本&#xff1a;2.7.14 Swagger版本&#xff1a;3.0.0 <dependency><groupId>com.github.xiaoymin<…