第三章 数据处理(1)简单变量,整型
面向对象OOP编程本质是设计并扩展自己的数据类型。在创建自己的数据类型之前,必须先理解c++的内置类型,因为这些类型是创建自己的类型的基本组件。内置c++类型分为两类,基本类型和复合类型,复合类型包括数组,字符串,指针和结构,基本类型包括整型和浮点型。
(一)简单变量
1.内置的c++类型
内置的c++类型有基本类型和复合类型。基本类型又包括整型和浮点型,而整型和浮点型又有很多变体。
2.记录信息的三个属性
为把信息存储在计算机中,程序必须记录3个基本属性:信息将存储在哪里?(通过变量名来标识);要存储什么值(通过赋值或初始化来实现);存储何种类型的信息(也就是存储的值怎样解读)。
3.变量的命名规则
只能使用字母,数字和下划线。以字母开头,多个单词时以下划线作为分隔。程序内部用变量名来标识变量的存储位置,可以使用&运算符来找到其相应的地址。
4.整型:
(1)short; int; long; long long;
每种都有有符号和无符号的区别,如singed和unsigned。再加上char,因此基本整型一共有十种。c++保证了整型的最小长度,而不确定具体的长度,这依赖实现。
Short,至少16位,-32768 到+32767;
Int,至少和short一样长(一般32位系统和64位系统中都为32位);
Long,至少32位;
Long long,至少64位,且至少和long一样长;
(2)运算符sizeof
(注意sizeof是运算符而不是函数)可以计算变量或类型的长度,如sizeof(int),得出的内容是字节数;头文件climits定义了符号常量来表示类型的限制,如INT_MAX表示int类型能表示的最大值。其他的有LONG_MIN,LLONG_MAX,ULLONG_MAX等。
#define语句用来进行符号常量的定义,同#include一样是预处理语句,本质上就是一个宏,相当于全局搜索并替换。是从c语言继承过来的,而c++有更好用的定义就是const,但如果要兼容c的程序,则必须使用#define aaa 1223,#define INT_MAX 32767等。
5.整型的初始化问题
一般初始化int a=3;这是最常用的。对于简单变量,可以使用小括号初始化方式,比如int x(32);就声明了x,初始值为32。
c++还提供了一种大括号类型的初始化器,这种初始化方式多用于数组和结构,但在c++98之后,也可以用于单值变量。其用法如下:int a={22},等于号可以有也可以没有,如int a{22}。int b{}表示b的值初始化为零。
6.无符号数
上面的short,int,long,long long都有无符号的版本,unsigned short等。整型变量的范围是有限制的,超过了这些范围会发生什么?这些整型变量的行为就像里程表。如果超越了限制,其值将为范围另一端的取值,如无符号整型最大值再加1就会得0。
7.整型字面值(进制的书写,表达方式)
如果开头是1到9,则表示是10进制;如果第一位是0,第二位是1到7,则表示使用的是八进制;如果前两位是0x,则表示用的是十六进制,a-f也是数字,不区分大小写。
在默认情况下,cout以十进制格式显示整数, 而不管这些整数在程序中是如何书写的。
要改变cout的输出,需要用控制符dec,hex,oct,进行输出方式的转换。再修改之前,原来的设置一直有效。比如std::cout<<std::hex;std::cout<<std::dec;其中,dec表示十进制,hex是十六进制,而oct代表八进制。
8.c++如何确定常量的类型(储存方式)
除非有足够的理由将整型常量存储为其他类型(比如有后缀,或者值太大),否则总是以int整型存储。后缀:l,ll,UL等(不区分大小写和顺序,用来表示存储的类型)。注意这里讲的类型是数据存储的类型,不是进制类型,进制类型上面已经讲过,是加前缀来区分。
常量整数存储类型:十进制的存放按照int,long,longlong能够容纳的最小类型中,十六进制按照int,unsigned int,long,unsigned long...中的最小类型中,因为常用十六进制来表示地址,而地址无符号,因此unsigned类型都存在。
9.char类型(用于存储字符和小整数)
(1)char类型
是一个字节存储的,是一种比short位数更少的类型,一般用于存储字符编码。美国有ASCII编码,国际UNICODE码。char同样可以存储很小的整数,当存储字符时用单引号引起来,其实char本身就是存储编码的,字符在计算机看来就是编码。
!!!!!注意:char型变量,是否有符号,跟具体的编译器有关系。在编程时,为了避免差错,所以在使用char作为有符号型使用时,在其前边加上signed,这样避免意外的bug。如果确定使用无符号的char,可以使用unsigned关键字来标识它。
(2)关于cout.put()
cout.put()通过调用cout的成员函数,来输出一个字符,“.”号是成员运算符,参数是字符变量或字符常量,比如cout.put(‘a’);char ch=’b’;cout.put(ch);。cout.put()函数可以输出单个字符,使用cout<<目前也能达到同样的效果,可以不用区分(在之前的c++中‘a’是以int型存储的,因此cout不能将其输出为字符),比如cout <<’a’;char ch=’b’;字符常量实际上就是字符的编码,但是使用‘a’这种表示方法不必考虑具体的编码实现,因此更具有直观性,而cout能够将‘a’输出为字符是因为cout的智能性,也就是‘a’常量也是用char类型来存储的,而不是跟以前一样用int来存储,因此可以被cout识别并输出成字符形式(也就是使用cout与使用cout.put()实际没有区别的原因)。
转义字符,通过\加上特殊字母的方式来输入通常不能通过键盘直接输入的字符,比如\n代表回车换行,\a代表振动声,\t表示table,\v表示数值的垂直制表符vertical table,\\表示反斜杠,\b表示backspace退格,\”表示双引号等。
10. 通用编码名,Unicode和ISO 10646
通用编码名(注意不是通用编码,指的是一个字符的别名,可以用来代替特殊的不容易打出的字符,具体的编码实现不一定是这样的)是c++用于表示特殊字符的机制,通常用\u或\U打头,后面是4个或8个16进制位,表示的是ISO 10646码。ISO10646和Unicode1991年合作,以确保它们的标准同步。注意,通用编码名不是通用编码,在不同的机子里编码可以不同,但通用编码名是相同的。
如果所使用的实现支持扩展字符,那么就可以在标记和字符串中使用通用编码名来进行字符输入(许多是不支持的)。
通用编码名是Unicode编码形式,因此普通的char类型是存储不了的,通常cout也不能对其输出,对于通用编码需要有特殊的存储单元和输出方式。(用到的时候再看,wchar_t和wcout算是一种,不过经常会和系统的编码冲突,而且wchar_t具体是多少位随着实现而不同,不太实用,而char16_t和char32_t的输入输出与需要对istream和ostream模板类进行新类型的具体化;一般仍然使用char类型并采用UTF-8编码,可以处理字符串,字符串仍使用char数组,但是不能处理单个字符)。
11. char类型的扩充(不常用)
Singed char和unsigned char,默认情况下,char既不是无符号,也不是有符号,具体有无符号由具体的实现来确定。可以用signed char bar,或unsigned char bar,来给char加入符号声明。Unsigned char通常范围为0-255,signed char通常为-128-+127。
wchar_t类型,即是宽字符类型,可以同时支持ASCII码和汉字,日语等的编码,其输入输出是通过wcout,wcin来进行。另外,可以通过大写L来指示宽字符常量或字符串,如wchar_t bob=L’p’;就表示p是一个宽字符常量编码。
由于wchar_t的长度和符号特征是随着实现而变化的,因此最好需要一个确定长度和符号的字符类型,也就是char16_t和char32_t,这是c++11新增的类型。对于常量,前者用u,后者用U来进行标示,比如u'p',U'p'。类型 char1 6_t 与\u00F6 形式的通用字符名相匹配,而类型char32_t与\U0000222B 形式的通用字符名相匹配 。
!!!!!注意:使用g++编译器进行编译的时候,默认是不使用c++11标准的,此时如果要使用c++11的相关内容,需要在编译的时候加入命令选项-std=c++0x,或者-std=gnu++0x,此时才可以使用比如char16_t和char32_t等关键字。上面的无论wchar_t,还是char16_t,char32_t,在有的计算机上(控制台程序)是显示不了的,可能是由于编码问题,计算机使用的编码不是Unicode编码或者是不同型号的Unicode编码,因此能不用就不用吧,实在要使用可以使用字符串(UTF-8),这个是没有问题的,系统自动进行转换。
12. bool类型
bool类型只有两个值,一个true一个false,true为1,false为0。另外,非零值赋值给bool类型都会被认为是true,零赋值给bool类型表示false。bool类型主要用来进行逻辑判断,可以说所有需要逻辑判断的地方,值最终都会转换成bool类型。
总之,所有的整型一共有11种(不包括特殊的字符编码类型),分别是char,short,int,long,long long,bool类型,前五种有有符号和无符号的区别(singned和unsigned),最后布尔类型只有true和false两个值。
