第三章 处理数据
3.1 简单变量
3.1.1 变量名
C++标识符命名规则如下:
● 在名称中只能使用字母字符、数字和下划线
● 名称的第一个字符不能是数字
● 区分大写字母和小写字母
● 不能将C++关键字用作名称
● 以两个下划线或下划线和大写字母开始的名称被保留给实现(编译器及其资源)使用,以一个下划线开头的名称被保留给实现(库函数的实现)。
● C++对名称的长度没有限制,但是某些平台有限制
3.1.2 命名方案
在变量名中使用变量类型作为前缀是好的习惯。例如整形变量可是使用n或者int的前缀、布尔型使用b前缀、指针使用p前缀、字符型使用c前缀、字符串型使用str或者sz前缀等。
3.2 整型
3.2.1 short, int, long 和 long long
short, int, long 和 long long的比特位数有如下约定:
● short至少为16位
● int至少与short一样长
● long至少为32位,且至少与int一样长
● long long至少为64位,且至少与long一样长
说明: 1. 可以使用sizeof运算符检查类型的长度;
2. 在climits头文件中包含了关于整型的限制信息。
3.2.2 初始化方式
C语言的初始化方式有:
int i = 5; //使用常量初始化
int j = i; //使用变量初始化
int k = i + j; //使用表达式初始化
C++特有的初始化方式:
int l(100); //使用小括号
C++11初始化方式:
int m = { 10 }; //使用大括号
int n{ 10 }; //使用大括号并省略等号
3.2.3 无符号类型
无符号类型有unsigned short、unsigned int、unsigned long、unsigned long long。
3.2.4 选择类型
int被设置为对目标计算机而言最“自然”的长度。这里“自然”是指计算机处理起来最快的长度。所以如果没有其他理由应当尽量使用int。
3.2.5 字面值
如果第一位是1~9,则表示十进制;
如果第一位是0,第二位是1~7,则表示八进制;
如果第一位和第二位是0X或0x,则表示十六进制;
整型字面值默认为int型(除非字面值过大或者加了表示其他类型的后缀);
整型字面值加上后缀可以表示其他类型;
L或者l表示long型,U或者u表示unsigned,ul(顺序和大小写任意)表示unsigned long型,ull表示unsigned long long型。
3.2.6 char型:字符和小整数
默认的,char既不是有符号的也不是没有符号的。是否有符号取决于C++的具体实现。但是可以手动指定符号,使用signed char和unsigned char。
C++11新增:
1) wchar_t。wchar_t有足够的空间,可以表示系统使用的最大扩展字符集。
2) char16_t。表示无符号16位。
3) char32_t。表示无符号32位。
字符字面值用单引号括起来。如’a’和’A’。
通用字符名。通用字符集是由ISO制定的ISO 10646标准所定义的字符编码方式。的用法类似于转义序列。通用字符名以u或者U开始。u后面跟4个十六进制数,使用2个字节,。U后面跟8个十六进制数,使用4个字节。
3.2.7 bool类型
C++将0值解释为假,将其他值解释为真。
关键字true值为1;
关键字false值为0。
3.2.8 const限定符
用法如:
const int MONTHS = 12; //符号常量
C语言使用#define定义符号常量。
C++应使用const限定符。
3.3 浮点型
3.3.1 浮点数的书写
1) 标准小数点表示法
如: 12.34
2) E表示法
如:2.52e+8、2.3E-4
3.3.2 C++中的浮点数
C++提供了三种浮点数:
● float。至少32位。
● double。至少48位,且不少于float。一般为64位。
● long double。至少和double一样多。一般为128位。
3.3.3 浮点常量
浮点字面值默认为double型。可用加入后缀表述其他类型。
加f或者F后缀为float型,加l或者L后缀为long double型。
3.4 类型转换
3.4.1 自动类型转换
遇到以下三种情形,C++自动执行类型转换:
1) 将一种算术类型的值赋给另一种算术类型的值
2) 表达式中包含不同的类型时
3) 将不同于形式参数的实参传递给函数时
注意:C++11中,使用初始化列表时,初始化不允许缩窄(narrowing)。如
char ch = { 31325 }; //错误
C++11中,算术表达式的自动转换使用的校验表如下:
1) 如果有一个操作数的类型时long double,则将另一个操作数转换为long double。
2) 否则,如果有一个操作数的类型是double,则将另一个操作数转换为double。
3) 否则,如果有一个操作数的类型是float,则将另一个操作数转换为float。
4) 否则,说明操作数都是整型,因此执行整型提升。
5) 在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。
6) 如果一个操作数是有符号的,另一个操作数为无符号的,且无符号操作数级别比有符号操作数级别高,则将有符号操作数转换为无符号操作数所属的类型。
7) 否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。
8) 否则,将两个操作数都转换为有符号类型的无符号版本。
3.4.2 强制类型转换
C++允许通过强制类型转换机制显示地进行类型转换。
强制转换的通用格式如下:
typeName (value);
(typeName) value;
也可以使用C++的static_cast,格式如下
static_cast<typeName>(value);
3.4.3 C++11中的auto声明
C++11新增一个工具,让编译器能够根据初始值的类型推断变量类型。定义了auto的含义。如:
auto x = 0.0; //x的类型是double