本章内容包括:
- C++变量的命名规则。
- C++内置的整型----unsigned long、long、unsigned int、int、unsigned short、short、char、unsigned char、singed char 和boot。
- C++11新增的整型:unsigned long long 和long long。
- 表示各种整型的数字字面值(常量)
- 使用const限定符来创建符号常量。
- C++内置的浮点类型:float、double和long double。
- 表示各种浮点类型的系统限制的cfloat文件。
- 表示浮点类型的数字字面值。
- C++的算术运算符。
- 自动类型转换。
- 强制类型转换。
面向对象编程(OOP)的本质是设计并扩展自己的数据类型。设计自己的数据类型就是让类型与数据匹配。
内置的C++类型分两组:基本类型和符合类型。本章将介绍基本类型,即整数和浮点数。
表示存储的数据的方法:使用变量。
3.1简单变量
3.1.1 变量名
C++变量命名规则:
- 在名称中只能使用字母字符、数字和下划线(_)
- 名称的第一个字符不能是数字
- 区分大小写字符
- 不用使用C++关键字作为名称
- 以两个下划线或下划线和大写字母打头的名称将被保留给实现(编译器及其使用的资源)使用。以一个下划线开头的名称被保留给实现,用作全局标识符(名称被声明的位置)
- C++对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台有长度限制。(ANSI C只保证名称中的前63个字符有意义)
多个单词组成名称的处理方法:
- 使用下划线字符分开单词(C程序员惯用)
- 从第二个单词开始首字母大写(Pascal程序员惯用)
3.1.2 整型
整数就是没有小数部分的数字,如2、10、12等。
- 语言只能表示所有整数的一个子集
- 不同C++整型使用不同的内存量来存储整数,使用的内存量越大,可表示的整数范围就越大
3.1.3 整型short、int、long、long long
- 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 <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位
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:初始化和赋值进行的转换
#2:以{}方式初始化(列表初始化)时进行的转换(C++11)
列表初始化不允许缩窄
#3:表达式中的转换
#4:传递参数时的转换
1.C++对char和short类型应用整型提升
2.将参数传递给取消原型对参数传递控制的函数时,C++将float参数提升为double
#5:强制类型转换
1.强制类型转换不会改变变量本身,而是创建一个新的、指定类型的值
2.强制类型转换格式
(typename) vlaue //C Styletypename (vlaue) //C++ Style,就像函数调用一般
3.static case value //更严格的类型转换
3.4.5 C++11中的auto声明
让编译器根据初始值的类型推断变量的类型一般用于处理复杂类型,比如STL中的类型