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

news2024/11/27 8:32:00

参考资料:

  • 《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.coloradmin.cn/o/978229.html

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

相关文章

postgresql-类型转换函数

postgresql-类型转换函数 简介CAST 函数to_date函数to_timestampto_charto_number隐式类型转换 简介 类型转换函数用于将数据从一种类型转换为另一种类型。 CAST 函数 CAST ( expr AS data_type )函数用于将 expr 转换为 data_type 数据类型&#xff1b;PostgreSQL 类型转 换…

《86盒应用于家居中控》——实现智能家居的灵动掌控

近年来&#xff0c;智能家居产品受到越来越多消费者的关注&#xff0c;其便捷、舒适的生活方式让人们对未来生活充满期待。作为智能家居方案领域的方案商&#xff0c;启明智显生产设计的86盒凭借出色的性能和良好的用户体验&#xff0c;成功应用于家居中控系统&#xff0c;让家…

Gof23设计模式之策略模式

1.概述 该模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式&#xff0c;它通过对算法进行封装&#xff0c;把使用算法的责任和算法的实现分割开来&#xff0c;…

剑指 Offer 43. 1~n 整数中 1 出现的次数(困难)

题目&#xff1a; class Solution { public:int countDigitOne(int n) {// mulk 表示 10^k// 在下面的代码中&#xff0c;可以发现 k 并没有被直接使用到&#xff08;都是使用 10^k&#xff09;// 但为了让代码看起来更加直观&#xff0c;这里保留了 klong long mulk 1;int…

Text Workflow for Mac,简单易用的文本转换工具

如果你需要一个能够将文本转换成多种语言和文件格式的工具&#xff0c;那么Text Workflow for Mac将是你的不二之选。 这个软件支持多种语言翻译和多种文件格式转换&#xff0c;让你可以轻松地将文本转换成你需要的形式。而且&#xff0c;它的操作非常简单&#xff0c;只需要几…

精讲算法的时间复杂度

目录 一、算法效率 1.算法效率 1.1如何衡量一个算法的好坏 1.2算法的复杂度 二、时间复杂度 1.时间复杂度的概念 2.大O的渐进表示法 3.常见时间复杂度的计算举例 三、空间复杂度 一、算法效率 1.算法效率 1.1如何衡量一个算法的好坏 long long Fib(int N) {if(N <…

Day6:浅谈useState

「目标」: 持续输出&#xff01;每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。 Day6-今日话题 谈谈react hooks中的useState &#xff0c;将从以下七个角度介绍&#xff1a; 用法 参数 返回值 作用 工作原理 优缺点 注意点 用法 useState 是一个函数&a…

Hugging News #0904: 登陆 AWS Marketplace

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」。本期 Hugging News 有哪些有趣的消息&#xff0…

VMware虚拟机安装CentOS7设置静态ip

vim /etc/sysconfig/network-scripts/ifcfg-ens33修改BOOTPROTO的值为static 增加最后那四项&#xff0c;参数在编辑&#xff0c;虚拟网络编辑器里面看

合宙Air724UG LuatOS-Air LVGL API控件-滑动条 (Slider)

滑动条 (Slider) 滑动条看起来和进度条是有些是有些像&#xff0c;但不同的是滑动条可以进行数值选择。 示例代码 -- 回调函数 slider_event_cb function(obj, event)if event lvgl.EVENT_VALUE_CHANGED then local val (lvgl.slider_get_value(obj) or "0")..&…

手写bind方法

<script>/** 手写bind方法* */Function.prototype.myBind function (thisArg, ...args) {return (...newArgs) > {return this.call(thisArg, ...args, ...newArgs)}}const obj {name: zs,age: 18,}function fn (a, b, c) {console.log(this)console.log(a b c)re…

《数据出境安全评估办法》解读

一、数据出境的统一评估体系正式确立 自我国《网络安全法》规定了关键信息基础设施运营者的重要数据与个人信息出境评估制度后&#xff0c;至今历时五年&#xff0c;关于数据出境及个人信息出境安全评估的立法体例、评估机制一直在探索过程中。 其后&#xff0c;国家互联网信…

PYTHON知识点学习-字典

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由 Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

java IO流(三) 转换流 打印流

转换流 前面我们学习过FileReader读取文件中的字符&#xff0c;但是FileReader默认只能读取UTF-8编码格式的文件。如果使用FileReader读取GBK格式的文件&#xff0c;可能存在乱码&#xff0c;因为FileReader遇到汉字默认是按照3个字节来读取的&#xff0c;而GBK格式的文件一个…

如何写一个sh脚本将一个本地文件通过 scp命令上传到远程的 centos服务器?

如何写一个sh脚本将一个本地文件通过 scp命令上传到远程的 centos服务器&#xff1f; 1.1 背景需求1.2 解决方案1.3 附录1.3.1 scp命令用法与示例1.3.1.1 scp命令用法与解释1.3.1.2 scp 命令用法示例1.3.1.2.1 示例一&#xff1a;从本地复制文件到远程计算机1.3.1.2.2 示例二&a…

Sqlserver 在 SELECT 语句中显示来自 GROUP BY 子句中未涉及的列

在SQL Server中&#xff0c;如果您在GROUP BY子句中对某些列进行了分组&#xff0c;但想在SELECT语句中同时显示未涉及到的其他列&#xff0c;您可以使用聚合函数和子查询的方法来实现。这可以通过在GROUP BY子查询中获取需要的聚合值&#xff0c;并在外部查询中选择其他列来完…

Java复习-20-接口(3)- 代理设计模式

代理设计模式(Proxy) 功能&#xff1a;可以帮助用户将所有的开发注意力只集中在核心业务功能的处理上。 代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标目标对象&#xff0c;可以在目…

复旦-华盛顿EMBA:走近亿咖通科技,探寻汽车智能化的科创“密码”

6月20日&#xff0c;应复旦大学-华盛顿大学EMBA项目18班校友周靖的邀请&#xff0c;项目校友参访了科创企业ECARX亿咖通科技。作为该公司资深副总裁、中国首席财务官&#xff0c;周靖带领大家通过产品演示、实车驾驶和交流对话探寻汽车智能化的科创“密码”&#xff0c;近距离感…

1.初识爬虫

爬虫是批量模拟网络请求的程序&#xff0c;想百度谷歌这种搜索类网站本质上就是爬虫 使用爬虫的时候不应该对别人的网站有严重的影响&#xff0c;比如你爬的频率太高了&#xff0c;让人家的网站崩溃了。不应该爬取网页上显示不到的内容&#xff0c;比如有一个直播的网站&#…

【SLAM】G2O优化库超详细解析

G2O&#xff0c;与ceres并列为目前视觉SLAM中应用最广泛的优化算法库。它最大的特点就是基于图优化设计&#xff0c;这对于视觉SLAM来说是异常适配的。在很多的SLAM库的中都使用到它来进行优化操作&#xff0c;比如ORB-SLAM。 代码仓库&#xff1a;https://github.com/RainerK…