《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.rhkb.cn/news/121633.html

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

相关文章

python实现对excel表中的某列数据进行排序

如下需要对webCms中的B列数据进行升序排序&#xff0c;且不能影响到其他列、工作表中的数据和格式。 import pandas as pd import openpyxl from openpyxl.utils.dataframe import dataframe_to_rows# 读取 Excel 文件 file_path 1.xlsx sheet_name webCms# 读取 Excel 文件并…

Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法

不论搭建什么工程&#xff0c;运行什么文件&#xff0c;只要在Pycharm中出现ImportError: DLL load failed: 找不到指定的模块这样的问题&#xff0c;以下方法都适用&#xff01;&#xff01;&#xff01; 一、问题描述 我在使用pycharm连接webots&#xff0c;用python控制机…

ToBeWritten之威胁狩猎

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

机器人中的数值优化(十一)——高斯牛顿法、LMF方法、Dogleg方法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

三相三线电表和三相四线电表有什么区别

三相三线电表和三相四线电表是两种常见的电能计量仪表&#xff0c;它们在结构、接线方式和使用范围上有所不同。本文将从以下几个方面详细介绍两者之间的区别。 一、结构上的区别 1.三相三线电表&#xff1a;三相三线电表主要由电压线圈、电流线圈、转子、铝盘和外壳等部分组成…

lv3 嵌入式开发-2 linux软件包管理

目录 1 软件包管理 1.1流行的软件包管理机制 1.2软件包的类型 1.3软件包的命名 2 在线软件包管理 2.1APT工作原理 2.2更新软件源 2.3APT相关命令 3 离线软件包管理 1 软件包管理 1.1流行的软件包管理机制 Debian Linux首先提出“软件包”的管理机制---Deb软件包 …

Linux设备驱动程序

一、设备驱动程序简介 图1.1 内核功能的划分 可装载模块 Linux有一个很好的特性:内核提供的特性可在运行时进行扩展。这意味着当系统启动 并运行时&#xff0c;我们可以向内核添加功能( 当然也可以移除功能)。 可在运行时添加到内核中的代码被称为“模块”。Linux内核支持好几…

Linux服务器部署JavaWeb后端项目

适用于&#xff1a;MVVM前后台分离开发、部署、域名配置 前端&#xff1a;Vue 后端&#xff1a;Spring Boot 这篇文章只讲后端部署&#xff0c;前端部署戳这里 目录 Step1&#xff1a;服务器上搭建后端所需环境1、更新服务器软件包2、安装JDK83、安装MySQL4、登录MySQL5、修…

基于FPGA的信号发生器(三角波、方波、正弦波)

目录 DDS实现原理 DDS整体设计框图​ Quartus II 仿真​ modelsim仿真 顶层代码 DDS实现原理 DDS(Direct Digital Frequency Synthesizer)直接数字频率合成器,也可叫DDFS。 DDS是从相位的概念直接合成所需波形的一种频率合成技术。 不仅可以产生不同频率的正弦波,而且可…

Java8实战-总结18

Java8实战-总结18 使用流筛选和切片用谓词筛选筛选各异的元素截短流跳过元素 使用流 流让你从外部迭代转向内部迭代。这样&#xff0c;就用不着写下面这样的代码来显式地管理数据集合的迭代(外部迭代)了&#xff1a; List<Dish> vegetarianDishes new ArrayList<>…

ArcGIS美化科研论文地图(利用在线底图)

1.加载在线底图服务 在ArcGIS Desktop中打开Catalog窗口&#xff0c;在GIS Servers中点击Add ArcGIS Server&#xff0c;之后选项全部默认&#xff0c;仅在URL中输入以下网址https://services.arcgisonline.com/arcgis 之后就可以看到底图了 我们在WorldElevation3D中选择Nat…

16-MyCat

一 Mycat概述 1 什么是Mycat 什么是Mycat Mycat是数据库中间件&#xff0c;所谓数据库中间件是连接Java应用程序和数据库中间的软件。 为什么要用Mycat 遇到问题&#xff1a; Java与数据库的紧耦合高访问量高并发对数据库的压力读写请求数据不一致 2 Mycat与其他中间件区别 目…

QT创建可移动点类

效果如图所示&#xff1a; 创建新类MovablePoint&#xff0c;继承自QWidget. MovablePoint头文件: #ifndef MOVABLEPOINT_H #define MOVABLEPOINT_H#include <QWidget> #include <QPainter> #include <QPaintEvent> #include <QStyleOption> #includ…

TS编译选项

自动监控编译 tsc xxx.ts -w 在一个文件夹下&#xff0c;创建 tsconfig.json 文件&#xff0c;在用命令 tsc 就可以自动编译当前文件夹下的ts文件 tsconfig.json文件配置如下&#xff1a; {/*tsconfig.json 是ts编译器的配置文件&#xff0c;ts编译器可以根据它的信息来对代…

springboot自定义表格(动态合并单元格)

一、需求展示&#xff08;一个订单多个商品&#xff0c;商品数量不限订单行合并&#xff09; 二、技术选型&#xff08;jxls自定义模板&#xff09; <!-- 版本具体看官网Release&#xff0c;这里我们使用 2.13.0 --><dependency><groupId>org.jxls</group…

jQuery 层次选择器

jQuery 层次选择器 &#xff08;0&#xff09;测试前的准备工作 A. 定义测试对象 B. 定义测试对象的 CSS 样式 C. 再定义一些测试用的 button。 &#xff08;1&#xff09;所有后代选择器(A B) 所有后代&#xff0c;包括其直接后代及间接后代。 &#xff08;2&#xff09;直…

javaee spring 测试aop 切面

切面类 package com.test.advice;import org.aspectj.lang.ProceedingJoinPoint;//增强类 public class MyAdvice {//将这个增强方法切入到service层的add方法前public void before(){System.out.println("添加用户之前");}}目标类 package com.test.service;publi…

Vue.js 报错:Cannot read property ‘validate‘ of undefined“

错误解决 起因&#xff0c;是我将elemnt-ui登录&#xff0c;默认放在mounted()函数里面&#xff0c;导致vue初始化就调用这个函数。 找了网上&#xff0c;有以下错误原因&#xff1a; 1.一个是你ref写错了&#xff0c;导致获取不了这个表单dom&#xff0c;我这显然不是。 2.…

【Python爬虫笔记】爬虫代理IP与访问控制

一、前言 在进行网络爬虫的开发过程中&#xff0c;有许多限制因素阻碍着爬虫程序的正常运行&#xff0c;其中最主要的一点就是反爬虫机制。为了防止爬虫程序在短时间内大量地请求同一个网站&#xff0c;网站管理者会使用一些方式进行限制。这时候&#xff0c;代理IP就是解决方…

成集云 | 金蝶云星空即时库存明细同步到多维表格 | 解决方案

源系统成集云目标系统 方案介绍 金蝶云星空是金蝶软件推出的新一代成长型企业SaaS管理软件&#xff0c;基于可组装低代码PaaS平台&#xff0c;构建了财务、供应链、采购管理、销售管理、生产管理、成本、税务、零售、电商、人力资源、协同办公等三十多个领域的一体化企业管理…