本章内容
- C++变量的命名规则
- C++内置的整型:unsigned long <—> long、unsigned int<—> int 、 unsigned
short<—> short、 unsigned char<—> signed char,char 、 bool - C++11新增的整型:unsigned long long 和 long long
- 表示各种整形的系统限制的climits文件
- 各种整型的数字字面值(常量)
- 使用const限定附来创建符号常量
- C++内置的浮点类型: float、double、long double
- 表示各种浮点类型的系统限制的cfloat文件
- C++的算术运算符
- 自动类型转换
- 强制类型转换
3.1 简单变量
为把信息存储在计算机中,程序必须记录3个基本属性:
- 信息存储在何处
- 存储什么值
- 存储何种类型的值
C++的解决办法:声明变量
3.2 整型
C++的基本整型按宽度递增的顺序排列:char、 short、 int、 long、 long long。
每种类型都有符号版本和无符号版本,共10种类型。
- 查看C++中各种整型在系统中的最大常数,可以在程序中使用C++工具来检查——climits中的符号常量。具体参见:climits中的符号常量
- 运算符sizeof:对类型名(如int)使用 sizeof 时,应将名称放在括号中;对变量名使用 sizeof
时,括号可省,如sizeof n_short
计算数组长度:sizeof(array),计算数组元素个数 sizeof(array) / sizeof(typename) - 初始化:将声明和赋值合并在一起。
- C++11新初始化方式,常用于数组和结构,也可用于单值变量:
— int cat = {24}; //cat 为24
— int emus{7}; //等号可省
— int psys{}; 或者 int psys = {}; //赋值为0
无符号类型
格式: unsigned typename variable;
对于无符号变量,如果超越了限制,其值将为范围另外一端的取值。
unsigned short sue = 32767;
short sam = 32767;
sue 加 1 为 32768,sam 加 1 为 -32768
整型字面值(常量)
C++有三种不同的计数方式:基数10、基数8、基数16。
-
十进制:第一位为1~9,如93;
-
八进制:第一位为0,第二位为1~7,如042;
-
十六进制:前两位为 0x or 0X,如0x42;
在默认情况下,cout以十进制格式输出。
iostream 也提供了三种计数方式的控制符:dec(十)、hex(八)、oct(十六)。
......
cout << "chest = " << chest;
cout << hex;
......
char类型:字符和小整数
char类型是专为存储字符而设计的
- 书写字符字面值:如ch = ‘M’,将符号用单引号括号括起。(C++对字符用单引号,对字符串用双引号)
- 上面 ch 是一个整数,可以对其使用整数操作,如加 1
- 函数cout.put() 显示字符常量,如 ch = 78,cout.put(ch) 将显示 N 。此外,要通过成员运算符(句点:“ . ")来使用对象(如cout)中的成员函数。
- 转义序列:\n 表示换行,具体见:C++转义序列的编码
bool类型
表示真和假,它们分别用预定义的字面值true和false表示。
const限定符
const关键字用来修改变量声明和初始化,功能类似于 #define 语句。
如const int Month = 12; //首字母大写以提示Month是常量
3.3 浮点数
浮点数可以表示带小数部分的数字
在计算机将,将浮点数分成两部分存储:
浮点数 = 基准值 * 缩放因子。如 34.1245 = 0.341245 * 100
缩放因子的作用是移动小数点的位置。(C++内部缩放因子是二进制数)
浮点数的两种写法:1.标准小数点表示法,如12.34、0.0023等;2.E表示法,如2.52e+8、8.33E-4。
浮点类型(按宽度递增的顺序排列):float、double、long double
系统中对浮点型数据的位数限制,可以从cfloat中找到。
- cout会删除浮点数据结尾的0,但调用cout.setf()会强迫输出使用定点表示法,防止程序把较大的值切换为E表示法
浮点常量
- 浮点常量在默认情况下都是double型
- float后缀:f、F
- long double后缀:l、L
浮点数的优缺点
与整形相比
优点:
- 能够表示整数之间的值
- 由于缩放因子,可以表示更大的范围
缺点:
- 运行速度慢
- 计算精度降低
3.4 C++算术运算符
5种基本运算符:加法(+)、减法(-)、乘法(*)、除法(/)、求模(%)。
每种运算符(操作符)都需要两个操作数,运算符及其操作数构成了表达式。
- 算术运算符遵循代数优先级:先乘除、后加减
- 仅当两个运算符被用于同一个操作数,优先级和结合性规则才有效
- 除法运算符的行为取决于操作数类型:整数 / 整数 = 整数,小数部分被丢弃;操作数其一是浮点数,结果为浮点数
- 对不同类型进行运算时,C++将把他们转换为同一类型
- 求模(%)运算符返回整数除法的余数
类型转换
- 将一种算术类型的值赋给另一种算术类型的变量时,C++将对值进行转换
- 表达式中包含不同的类型时,C++将对值进行转换
- 将参数传递给函数时,C++将对值进行转换
转换 | 潜在的问题 |
---|---|
较大浮点型转换为较小浮点型,如double -> float | centered 精度降低,值可能超出目标类型的取值范围,导致结果不确定 |
浮点类型转换为整型 | 小数部分丢失,原值可能超出目标类型的取值范围,导致结果不确定 |
较大整型转换为较小整型,如 int -> short | 值可能超出目标类型的取值范围,通常只复制右边的字节 |
-
以{}方式初始化时进行的转换(C++11)
C++将使用大括号{}的初始化称为列表初始化,因其常用于给复杂的数据类型提供值列表。
列表初始化不允许缩窄:即变量的类型可能无法表示赋给它的值,如 char c1 {31325} -
表达式中的转换
-如果有一个操作数的类型是long double,则将另-个操作数转换为long double
-否则,如果有一个操作数的类型是double,则将另一个操作数转换为double
-否则,如果有一个操作数的类型是float,则将另一个操作数转换为float
-否则,说明操作数都是整型,因此执行整型提升
-在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一 个低,则转换为级别高的类型
-如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高,则将有符号操作数转换为无符号操作数所属的类型
-否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型
-否则,将两个操作数都转换为有符号类型的无符号版本 -
传递参数时的转换
传递参数时的类型转换通常由C++函数原型控制。 -
强制类型转换
C++允许通过强制类型转换机制显式地进行类型转换。强制类型转换地格式有两种:
-(typename) value; //来自c语言
-typename (value); //来自C++
C++11中的auto声明
auto是一个C语言关键字,在初始化声明中使用auto,而不指定变量类型,编译器将把变量的类型设置成与初始值相同。如:
auto x = 0.0; //x为double型
auto z = 0; //z为int型