#C++ Primer Plus# 第三章 处理数据

  • 面向对象编程(OOP)的本质:设计并扩展自己的数据类型
  • 内置C++数据类型


    C++数据类型
  • 标识存储的数据的方法:使用变量
  • C++中的算术运算
  • C++中的类型转换

3.1 简单变量

信息存储的三个基本属性:

  • 信息将存储在哪里
  • 要存储什么值
  • 存储何种类型的信息

3.1.1 变量名

C++变量命名规则:

  • 在名称中只能使用字母字符、数字和下划线(_)
  • 名称的第一个字符不能是数字
  • 区分大小写字符
  • 不用使用C++关键字作为名称
  • 以两个下划线或下划线和大写字母打头的名称将被保留给实现(编译器及其使用的资源)使用。以一个下划线开头的名称被保留给实现,用作全局标识符(名称被声明的位置)
  • C++对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台有长度限制。(ANSI C只保证名称中的前63个字符有意义)

多个单词组成名称的处理方法:

  • 使用下划线字符分开单词(C程序员惯用)
  • 从第二个单词开始首字母大写(Pascal程序员惯用)

3.1.2 整型

  • 语言只能表示所有整数的一个子集
  • 不同C++整型使用不同的内存量来存储整数,使用的内存量越大,可表示的整数范围就越大

3.1.3 整型short、int、long、long long

  1. C++确保这些类型的最小长度:

    • short至少16位
    • int至少与short一样长
    • long至少32位,且至少与int一样长
    • long long至少64位,且至少与long一样长
  2. 位:计算机内存的基本单元,每一位都有0/1两种可能。

  3. 字节:8位的内存单元。

  4. C++字节:由至少能够容纳实现的基本字符集的相邻位组成,即可能的取值数目必须等于或超过字符总数。在使用ASCII码的系统中,一个字节表示8位;在使用Unicode的系统中,一个字节表示16或32位。

  5. short是short int的简称,long是long int的简称

  6. sizeof运算符返回类型或变量的长度,对类型名,将名称放在括号中;对变量名,括号是可选的。eg:sizeof(int); sizeof n_short;

  7. 头文件climits定义了表示各种限制的符号名称,比如 INT_MAX

  8. #define INT_MAX 32767#define是一个预处理器编译指令,它查找独立的token(单独的单词),跳过嵌入的单词,进行替换

  9. 变量初始化的三种方式:

    • int owls = 101; // 来自C语言
    • int wrens(432); // C++方式
    • int hamburgers = {24}; //C++11初始化方式,用于数组或结构,也可用于单值变量
  10. C++11初始化方式

    • int a{2};//a=2
    • int b = {3};//b=3
    • int c{};//c=0
    • int d = {};//d=0

C++11使得可将大括号初始化器用于任何类型(可以使用等号,也可以不使用),这是一种通用的初始化语法。

3.1.4 无符号类型

  1. 优点:增大变量能够存储的最大值
  2. 使用:使用关键字unsigned(unsigned int的缩写)
  3. 典型的整型溢出行为


    典型的整型溢出行为

3.1.5 选择整型类型

  1. int被设置为目标计算机的自然长度(natural size,指的是计算机处理起来效率最高的长度)
  2. 如果没有非常有说服力的理由,则选择int
  3. 如果变量表示的值不可能为负,则使用无符号类型
  4. 如果知道可能表示的整数值大于16位证书的额最大可能值,则使用long
  5. 如果存储的值操作20亿,则使用long long
  6. 当有大型整型数组或节省内存很重要时才使用short

3.1.6 整型字面值

  1. 十进制:第一位是1~9
  2. 八进制:第一位是0
  3. 十六进制:前两位是0x或0X
  4. 虽然有不同的表示方式,但是都将以相同的方式(二进制数) 存储在计算机中
  5. 控制符oct或hex,实际上是一条消息,告诉cout采取何种行为
int a = 10;
//输出八进制
cout <<oct
 <<a;
//输出十六进制
cout <<hex
 <<a;

3.1.7 C++如何确定常量的类型

  1. 除非有理由(使用特殊后缀或者值太大)存储为其他类型,否则默认将整型常量存为int
  2. 首先看后缀
    • long:l/L后缀
    • unsigned int:u/U 后缀
    • unsigned long:ul/uL/Ul/UL后缀
    • long long 和 unsigned long long 同理
  3. 其次看长度
    • 对于不带后缀的十进制整数的考虑顺序:int 、long、long long
    • 对于不带后缀的十六进制或八进制整数的考虑顺序:int、unsigned int、unsigned long、long long、unsigned long long

3.1.8 char类型:字符和小整数

  1. 存储字母:通过字母的数值编码解决问题
  2. char用来处理字符,也可以用做比short更小的整型
  3. cin和cout的转化作用:根据变量类型,输入和输出字符类型
  4. C++对字符使用单引号,对字符串使用双引号
  5. cout.put(字符常量/字符变量) 函数
    • 作用:显示一个字符
    • 是ostream的一个成员函数,句号是成员运算符
    • 历史缘故:cout在C++Release 2.0之前,cout将字符变量显示为字符,而将字符常量显示为数字
  6. char字面值
    • 常规字符:使用单引号括起
    • 非常规字符(比如单引号):使用转义字符(\)转义,可以使用数字转义序列或字符转义序列(比如 \0x8和\b都表示退格)
  7. 通用字符名
    • C++支持一个基本的源字符集,即可用来编写源代码的字符集
    • C++标准还允许实现提供扩展源字符集和扩展执行字符集
    • C++提供一种表示特殊字符的机制,独立于任何特定的键盘,使用通用字符名(universal character name)
    • \u + 8个十六进制位
    • \U + 16个十六进制位
  8. signed char和unsigned char
    • char在默认情况下既不是有符号也不是没有符号的,是否有符号由C++实现决定
    • signed char范围-128~127,unsigned char范围0~255
  9. wchar_t
    • 解决的问题:程序需要处理的字符集无法使用一个8位的字节表示
    • 解决方法1:如果大型字符集是实现的基本字符集,那么编译器厂商可以将char定义为一个16位字节或者更长的字节
    • 解决方法2:使用wchar_t (宽字符类型),底层的类型取决于C++实现,可能是unsigned short或int等
    • wcin和wcout可以处理wchar_t流
    • 加上前缀L来指示宽字符常量和宽字符串(如,L"tall")
  10. C++ 11新增类型:char16_t 和 char32_t
    • 解决的问题:Unicode的普及,对特定长度和符号特征的类型的需要,而wchar_t随实现而不同
    • 使用前缀u指示char16_t,无符号,长16位
    • 使用前缀U指示char32_t,有符号,长32位

3.1.9 bool类型

  1. C++将非零值解释为true,将零解释为false
  2. 任何数字值或指针值都就可以被隐式转换为bool值

3.2 const限定符

符号常量的表示:

  • 名称首字母大写
  • 整个名称大写
  • 使用前缀k
  • ......

如果声明常量时没有提供值,则该常量的值将是不确定的,且无法修改的。

const较#define的优点:

  • 能够明确指定类型
  • 可以用使用C++的作用域规则将定义限定在特定的函数或文件中
  • 可以将const用于复合类型

ANSI C和C++中const的区别:

  • 作用域规则
  • C++中可以用const值声明数组长度

3.3 浮点数

小数,带小数部分的数字,分两部分存储,一部分表示值,另一部分表示缩放因子(用来移动小数点的位置)。

3.3.1 书写浮点数

  1. 标准小数点表示法
  2. E表示法
    • d.dddE+n表示将小数点向右移动n位
    • d.dddE-n表示将小数点向坐移动n位
E表示法

3.3.2 浮点类型

  1. C++有3中浮点类型:float、double、long double
  2. 表示:有效数位+允许的指数最小范围
  3. 有效位(significant figure):数字中有意义的位
  4. 可以查看头文件cfloat获取系统对浮点数的限制

3.3.3 浮点常量

  1. 默认情况下为double类型
  2. 如果希望常量为float类型,请使用f或F后缀
  3. 如果希望为long double,可使用l或L后缀

3.3.4 浮点数的优缺点

  1. 可以表示整数之间的值
  2. 由于有缩放因子,可以表示更大范围的的数
  3. 浮点运算速度慢,精度低

3.4 C++算术运算符

3.4.1 运算符优先级和结核性

  1. 仅当两个运算符被用于同一操作数时,优先级和结合性规则才有效
  2. C++使用优先级规则来确定首先使用哪个运算符
  3. 可以使用括号来执行自己定义的优先级
  4. 当两个运算符优先级相同时,C++看操作数的结合性是从左到右还是从右到左

3.4.2 除法分支

除法运算符(\)的行为取决于操作数的类型

除法运算符的行为取决于操作数的类型

3.4.3 求模运算符

求模运算符(%):返回整数除法的余数

3.4.4 类型转换

自动类型转换的情况:

  • 将一种算术类型的值赋给另一种类型的变量
  • 表达式中包含不同的类型
  • 将参数传递给函数时

#1:初始化和赋值进行的转换

转换 潜在的问题
将较大的浮点类型转换为较小的浮点类型,比如double转float 精度降低;当值超出范围时,结果不确定
将浮点型转为整型 小数部分丢失;当值超出范围时,结果不确定
将较大的整型转为较小的整型,如long转short 当值超出范围时,通常只复制右边的字节

#2:以{}方式初始化(列表初始化)时进行的转换(C++11)

列表初始化不允许缩窄

#3:表达式中的转换

自动转换 不同类型运算时转换
- bool、(unsigned)char、short 自动转为 int,因为int类型是计算机的自然类型<br />- 若short比int短,则unsigned short被转为int;若长度相同,则unsigned short被转为unsigned int<br />- wchar_t被转换成下列第一个宽度足够存储其取值范围的类型:int、unsigned int、long和unsigned long 1. 按下列顺序,当有一个类型符合,则另一个操作数将被转换成同一类型:long double>double>float <br />2. 整型提升<br />3. 比较有无符号和操作数的级别

#4:传递参数时的转换

  1. C++对char和short类型应用整型提升
  2. 将参数传递给取消原型对参数传递控制的函数时,C++将float参数提升为double

#5:强制类型转换

  1. 强制类型转换不会改变变量本身,而是创建一个新的、指定类型的值
  2. 强制类型转换格式
    • (typename) vlaue //C Style
    • typename (vlaue) //C++ Style,就像函数调用一般
  3. static case<typename> value //更严格的类型转换

3.4.5 C++11中的auto声明

  • 让编译器根据初始值的类型推断变量的类型
  • 一般用于处理复杂类型,比如STL中的类型
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容