本章内容包括:
- C++变量的命名规则
- C++内置的整型——unsigned long、long、int、unsigned short、short、char、unsigned char、signed char和bool
- C++11新增的整型:unsigned long long和long long
- 表示各种整型的数字字面值(常量)
- 使用const限定符来创建符号常量
- C++内置的浮点类型——float、double和long double
- 表示各种浮点类型的系统限制的cfloat文件
- 各种浮点类型的数字字面值
- C++的算数运算符
- 自动类型转换
- 强制类型转换
OOP的本质是设计并扩展自己的数据类型。
3.1 简单变量
3.1.1 变量名
- C++命名规则:以两个下划线打头或以下划线和大写字母打头的名称被保留给实现(编译器及其使用的资源)使用。以一个下划线开头的名称被保留给实现,用作全局标识符。C++对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台有长度限制。
- 命名方案:n整数值、str/s以空字符结束的字符串、b布尔值、p指针、c单个字符
3.1.2 整型
- 宽度:用于描述存储整数时使用的内存量
- C++基本整型分别是char, short, int, long和新增的long long,其中每种类型都有符号版本和无符号版本
3.1.3 整型short, int, long和long long
- 计算机内存由位组成
- C++确保了最小长度:short至少16位;int至少与short一样长;long至少32位,且至少与int一样长;long long至少64位,且至少与long一样长
- 位与字节:字节(byte)指的是8位的内存单元
- sizeof运算符返回类型或变量的长度;头文件climits中包含了关于整型限制的信息
3.1.3.1 运算符sizeof和头文件climits
- 在使用8位字节的系统中,int的长度为4个字节
- 对类型名使用sizeof运算符时,应将名称放在括号中;但对变量名使用该运算符,括号是可选的
- 头文件climits定义了符号常量来表示类型限制:#define编译指令的工作方式与文本编辑器或字处理器中的全局搜素并替换命令相似
3.1.3.2 初始化
- 初始化将赋值和声明合并在一起
- C++还有一种C语言没有的初始化语法
int wrens(432);
3.1.3.3 C++11初始化方式{}
- 大括号初始化方式用于数组和结构,也可用于单值变量
- 通过使用大括号初始化器,初始化常规变量的方式与初始化类变量的方式更像,C++11使得可将大括号初始化器用于任何类型
3.1.4 无符号类型
- 优点:增大变量能够存储的最大值
3.1.5 选择整型变量
- 自然长度指的是计算机处理起来效率最高的长度,int被设置为对目标计算机而言最为自然的长度
3.1.6 整型字面值
- 三种计数方式:基数为10、8、16,不管是什么计数方式,都将被存储为二进制数
- cout提供了控制符dec、hex和oct分别用于指示cout以十进制、十六进制和八进制格式显示整数
cout<<hex;
不会在屏幕上显示任何内容,只是修改cout显示整数的方式;hex位于命名空间std中
3.1.7 C++确定常量的类型
- 后缀: 后缀是放在数字常量后面的字母,用于表示类型。l或L表示long,u或U表示unsigned int,ul表示unsigned long,ll或LL表示long long,ull、Ull、uLL和ULL表示unsigned long long.
- 长度:对于不带后缀的十进制数,将使用下面几种类型中能够存储该数的最小类型来表示:int、long或long long。对于不带后缀的十六进制或八进制数,将使用下面几种类型中能够存储该数的最小类型来表示:int、unsigned int、long、unsigned long、long long和unsigned long long。这是因为十六进制常用来表示内存地址,而内存地址是没有符号的。
3.1.8 char类型:字符和小整数
- C++支持的宽字符类型可以存储更多的值,如国际Unicode字符集使用的值。
- 输入时,cin将键盘输入的字符转换为对应的ASCII码;输出时,cout将ASCII码值转换为所显示的字符。cin和cout的行为是由变量类型引导的。
cout.put()
函数用于显示一个字符。
//the char type and int type contrasted
#include<iostream>
int main()
{
using namespace std;
char ch='M';
int i=ch;
cout<<ch<<endl;
cout<<iendl;
ch=ch+1;
i=ch;
cout.put(ch);
cout<<endl;
cout<<i<<endl;
}
3.1.8.1 程序说明
- char变量ch初始化为’M’,将把ch设置为77,然后将ch赋值给i,所以i=77。cout把ch显示为M,把i显示为77。值的类型将引导cout选择如何显示值。
- C++将字符表示为整数。
char ch; cin>>ch;
如果输入数字5,代码将读取字符“5”,将其对应的ASCII码存到变量ch中。int n; cin>>n;
如果输入数字5,代码将读取字符“5”,将其转换为相应的数字值5存到变量n中。
3.1.8.2 成员函数cout.put()
- 类定义了如何表示和控制数据。成员函数归类所有,描述了操纵类数据的方法。
- 只能通过类的特定对象来使用成员函数。点被称为成员运算符。
3.1.8.3 char字面值
- 对于常规字符,最简单的方法是将字符用单引号括起;数值编码。
- 转义序列:可以基于字符的八进制和十六进制编码来使用转义序列
3.1.8.4 通用字符名
- C++实现支持一个基本的源字符集,即可用来编写源代码的字符集;还有一个基本的执行字符集,包括在程序执行期间可处理的字符。
- 通用字符名:\u00F6被解释为“Unicode码点为U-00F6的字符”。
3.1.8.5 signed char和unsigned char
- char是否有符号由C++实现决定,这样编译器开发人员可以最大限度地将这种类型与硬件属性匹配起来。
3.1.8.6 wchar_t
3.1.8.7 C++新增的类型:char16_t和char32_t
3.1.9 bool类型
- 任何数字值或指针值都可以被隐式转换为bool值。
3.2 const限定符
const typename =value;
- const比#define好:能明确指定类型;可以使用C++的作用域规则将定义限制在特定的函数或文件中;可以将const用于更复杂的类型。
3.3 浮点数
- 计算机将浮点数按两部分存储:一部分表示值,另一部分用于对值进行放大或缩小。
- C++内部表示浮点数基于二进制数。
3.3.1 书写浮点数
- 标准小数点表示法;E表示法
3.3.2 浮点类型
- float、double和long double。这些类型是按它们可以表示的有效数位和允许的指数最小范围来描述的。
- float至少32位,double至少48位,且不少于float;long double至少和double一样多。通常float为32位,double为64位,long double为80、96或128位。这三种类型的指数范围至少是-37到37。
cout.setf()
迫使输出使用定点表示法,防止把较大的值切换为E表示法,并显示到小数点后6位。
3.3.3 浮点常量
- 在默认情况下,浮点常量属于double类型
- 如果希望常量为float类型,使用f或F后缀;对于long double类型,可用l或L后缀
3.3.4 浮点数的优缺点
- 可以表示整数之间的值;由于有缩放因子。可以表示的范围更大
- 浮点运算的速度比整数运算慢,且精度将降低
3.4 C++运算符
3.4.1 运算符优先级和结合性
3.4.2 除法分支
- 对不同类型进行运算时,C++将它们全部转换为同一类型
3.4.3 求模运算符
3.4.4 类型转换
- 将一种运算类型的值赋给另一种算数类型的变量时;表达式中包含不同的类型时;将参数传递给函数时。
- 赋值时进行的转换:
潜在的数值转换问题:将较大的浮点类型转换为较小的浮点类型,精度降低,值可能超出目标类型的取值范围;将浮点类型转换为整型,小数部分丢失,原来的值可能超出目标类型的取值范围;将较大的整型转换为较小的整型,原来的值可能超出目标类型的取值范围,通常只复制右边的字节。
//assign.cpp
#include<iostream>
int main()
{
using namespace std;
cout.setf(ios_base::fixed,ios_base::floatfield);
float tree=3;//tree=3.000000
int guess(3.9832);//guess=3;
int debt=7.3E12;//C++没有对结果进行定义
cout<<"tree="<<tree<<endl;
cout<<"guess="<<guess<<endl;
cout<<"debt="<<debt<<endl;
return 0;
}
- 表达式中的转换:首先一些类型在出现时便会自动转换;其次,有些类型在与其他同时出现在表达式中时将被转换。
自动转换:在计算表达式时,C++将bool、unsigned char、signed char和short值转换为int。这些转换被称为整型提升。
short chickens=20;
short ducks=35;
short fowl=chickens+ducks;//C++程序取得chickens和ducks的值,将他们转换为int;然后程序将结果转换为short类型,将结果赋给一个short类型变量。
当运算涉及到两种类型时,较小的类型将被转换为较大的类型。
- 传递参数时的转换:传递参数的类型转换通常由C++函数原型控制。
- 强制类型转换:两种强制转换的格式。
(long) thorn//格式一
(typeName) value//格式二
//typecast.cpp
#include<iostream>
using namespace std;
int main()
{
int auks, bats, coots;
auks = 19.99 + 11.99;//31.98被截短为31,auks=31
bats = (int)19.99 + (int)11.99;//被截短为19和11,bats=30
coots = int(19.99) + int(11.99);//被截短为19和11,bats=30
cout << "auks=" << auks << ",bats=" << bats;
cout << ",coots=" << coots << endl;
char ch = 'Z';
cout << "The code for " << ch << " is ";
cout << (int)ch << endl;//打印ASCII码,90
return 0;
}
3.5 总结
- C++基本类型分为两组:整数和浮点数
- 字符通过其数值编码来表示