C++:第三课

处理数据
内置的C++类型分为两组:基本类型和复合类型;
基本类型是整数和浮点数;复合类型包括数组,字符串,指针和结构;

简单变量
程序需要存储信息,为了把信息存储到计算机,程序必须记录3个基本属性;
①信息将存储在哪里
②存储的值是多少
③存储何种类型的信息

变量名
①只能使用数字,字母和下划线
②第一个字符不能是数字
③区分大小写
④不能将关键字作为名字
⑤C++对名称的长度没哟限制,但是平台对长度有限制

整型
整数,就是指没有小数的数字;
不同C++整型使用不同的内存来存储整数;使用的内存量越大,表示的数值范围就越大;另外,有的类型可表示正值和负值(有符号的整型),有的类型不能表示负值(无符号);宽度width用于描述存储整数时使用的内存量;使用的内存越多就越宽;
C++的基本整型分别是char,short,int,long,以及long long,每种类型都有符号版和无符号版本,因此,共有10种类型可供选择;

计算机内存由一些叫做位(bit)的单元组成,C++中的short,int,long和long long 通过不同数目的位来储存,最多能够表示4种不同的整数宽度;
C++提供了一种灵活的标准,它确保了每种类型的最小长度,即:
①short最少是16位;
②int至少与short一样长;
③long至少32位,且至少与int一样长;
④long long至少64位,且至少与long一样长

计算机内存的基本单位是位,每一位用0或者1表示,8位的内存块可以有256种不同的组合,因此8位单元可以表示0-255(无符号,unsigned),或者-128到127(有符号);每增加一位,组合数便增加;所以16位单元表示65535个值;
字节(byte)通常指的是8位的内存单元;从这个意义上来说,字节就是描述计算机内存量的度量单位;1M=1024KB,1KB=1024Byte;
C++对字节的定义有所不同,它是根据不同的系统的来定义的,比如C++字节可以是8位,也可以是16位,甚至32位;
类型的宽度随实现而异,要想知道类型的宽度,可使用sizeof运算符,它返回的是字节;
short,int,long,long long都是符号类型,即他们表示的取值范围中,正值和负值相差不大;
头文件climits中,包含了关于整型限制的信息,它定义了表示各种限制的符号名称;如INT_MAX表示int整型的最大值等;
对类型名使用sizeof运算符时,应将名称放在括号中,如sizeof(int);而使用变量时,括号是可选的,如sizeof n;
climits文件由编译器厂商提供,该文件指出了其编译器中的值;因为不同的编译器,相同整数类型表示的值的范围也不同;

 

#define 是预处理器命令,如 #define INT_MAX 32265 ---> 表示查找程序中的INT_MAX ,将全部的INT_MAX替换为32265,然后开始编译;修改后的程序将在完成这些替换后被编译;也可以使用#define来定义自己的符号常量;
如果不对函数内部的变量进行初始化,该变量的值将是不确定的;这意味着该变量的值,将是它被创建之前,相应内存单元保存的值,也就说所说的垃圾值;

C++中有其他的特殊的初始化方法;
①int a(15);将15赋给a;
②int a = {15};
③int a{15}
如果{}中不包含任何内容,表示值为0;
C++的大括号初始化器适用于任何类型,这是一种通俗的初始化方法;这是为了让新手更容易学习C++;

无符号类型
它的优点是可以增大变量可以存储的最大值,如short,它有符号的话,范围是-32768到+32767,如果是无符号的,范围便是0-65535;当然,仅当数值不会为负时才会使用无符号类型,如人口等;
需要关键字unsigned来修改声明;unsigned本身是unsigned int的缩写;

整型变量的行为就像里程碑,如果超越了限制,其值将为范围另一端的取值,即从头开始;
C++确保了无符号类型的这种行为,但C++并不保证符号整型超越限制时不出错;

关于整型溢出
符号整型和无符号整型在增加或者减少时,都会有一个零界点,这个零界点也是重置点,超出这个重置点,值会向另外一个方向发展;
整数溢出有图

选择整型类型
int被设置为对目标计算机而言最为"自然"的长度,自然长度指的是计算机处理起来效率最高的长度,所以,如果没有特殊说明,则应选择int;

整型字面值
C++以三种不同的计数方式来书写整数:基数为10,第一二位1~9,如93;基数为8,第一位为0,第二位为1~7,如042;基数为16;第一二位为0x或者0X,如0x42;
对于16进制,字符a~f或者A~F,代表了十六进制,对应于10~15;
在默认情况下,cout是以10进制来输出的,不管这些整数在程序中如何书写;而且,不管把值书写成10进制还是16进制,它们都将以相同的方式存储在计算机中--二进制;如果要以16进制或者8进制的方式显示值,可使用cout的一些特性,分别是dec,hex和oct,分别表示10进制,16进制和8进制的显示方式,使用方式是cout<<hex,该语句不会在屏幕上显示任何内容,而只是修改cout显示整数的方式;标识符hex在命名空间std中,而在程序中又使用了std,所以在程序中不能将hex作为变量名,不过,如果没有使用using编译指令,hex还是可以用在程序中的;

C++如何确定常量类型
如果一个常量是1429,编译器如何确定它的类型呢?程序是把它存储为int,long还是short呢?答案是,除非有理由存储为其他类型(如使用了后缀,或者值太大int存储不了),否则将整型变量存储为int类型;
后缀,放在常量后面的字母,它表示整数的类型,如22022U表示unsigned int类型,22022UL表示unsigned long类型;
长度,在C++中,常量分别以10进制,8进制,还是16进制表示时,它们的存储类型都不相同;因为16进制一般是表示内存地址,内存地址是没有负数的,即是没有符号的,所以对于不带后缀的16进制的常量,一般是用int,unsigned int,unsigned long,long long 或者是unsigned long long来表示;因此,unsigned int比long更合适存储16进制的内存地址;

char类型
专门为存储字符(字母或者数字)而设计的;
char是另一种整型,它足够长,能够表示目标计算机系统中的所有字符,实际上很多计算机操作系统支持的字符不超过128个,所以,一个字节就可以表示计算机中的所有字符;因此,char是比short存储量更小的整型;

值的类型,将引导cout如何选择显示值;

cout.put()
在C++的早期版本中,cout将字符变量打印为字符,而字符常量打印为数字,如cout << 'M';打印出来的是77,所以,为了改变这种情况,使用了cout.put();

转义字符
可以基于字符的8进制和16进制编码来使用转义序列;在可以使用数字转义序列或者是符号转义序列时,应使用符号序列;

通用字符名

与int不同的是,char在默认情况下既不是有符号,也不是没有符号的,是否有符号由c++实现来决定;也就是说,你写了句char a ;这个char可能是有符号的,也有可能是没有符号的;

当要处理日文或者汉字这样的字符时,8位的char根本就不够,这个怎么办?
有两种方式:
①厂商可以将char定义为一个16位甚至更长的字节;
②8位char表示基本字符集,另一种类型wchar_t(宽字符类型)表示扩展字符集
如果使用了wchar_t类型,输入和输入需要使用wcout和wcin;

由于wchar_t的长度和符号特征随实现而定,它没有特定的长度和符号,因此新增了char16_t和char32_t,他们都是无符号的,一个长16位,一个长32位;前缀u表示char16_t字符常量和字符串常量,使用前缀U表示char32_t;

bool类型
C++将非0表示true,0表示为false;因此bool可以这样表示:
bool a = true ; bool = -200 ;他们都表示true;
字面值true和false都可以提供提升转换为int类型,true被替换成1,false被替换成0,因此:
int a = true ;其实就等同于a = 1 ;

const限定符
使用const修饰的变量为常量,即它的值不可以更改,也就只读变量;
如果在声明时没有给常量赋值,那他的值是不确实的,并且不可更改;

浮点数
它能够表示带小数的部分,它们提供的值的范围也更大,如果大到无法用long去存储,可以使用浮点数来存储;
浮点数在计算机内部分成两部分存储,一部分表示值,一部分用于对值进行放大或者缩小,缩放因为就是移动小数点的位置,术语浮点因此而得名;
浮点数有两种表示方法,一种是正常的书写,如8.0;一种是E表示法,如7E5,表示7*100000,它也是浮点数,与7.0E5相同;用E表示时,数字中不能有空格,如7.2 E6是非法的;

浮点类型
C++有3种浮点类型:float,double,long double;这些类型以他们可以表示的有效位数和允许的指数最小范围来描述的;有效位数是数字中有效的位;
C++对有效位数的要求是,float至少是32位,double至少是48位,且不少于float,long double至少和double一样多,这三种类型的有效位数可以一样多;
然而,通常,float为32位,double为64位,long double为80,96或128位;另外,这三种类型的指数范围至少是-37到37;
float的精度比double低,float的精度大约位6位,而double大约为15位;

浮点常量
默认是double类型,如果希望是float类型,在后面添加后缀f或者F,对于long double,可使用L作为后缀;

浮点类型的优缺点
由于有缩放因子,浮点型表示的值大得多;但是浮点数的运算效率比整数低,而且精度将降低;
如:2.34E+23,表示小数点后面有23位,2.34E+23 + 1.0f,就是在第23位加1,但float类型只能表示数字中的前6位或者前7位,因为修改第23位对这个值几乎没有影响;

C++算数运算符
加法,减法,乘法,除法,求模
%运算符用于浮点数将导致编译出错,也就是说两个操作数必须是整数;

类型转换
为解决不同类型之间的混乱运算问题,C++自动执行很多的类型转换:
①将一种算术类型的值赋给另一种算术类型的变量时,C++对值进行转换;
②表达式中包含不同的类型时,C++对值进行转换;
③将参数传递给函数时,C++对值进行转换

C++允许将一种类型的值赋给另一种类型的变量,这样做时,值将被转换为接收变量的类型;
将一个值赋给取值范围更大的类型通常不会导致什么问题;但是将一个很大的值赋给比它小的类型时,可能会导致降低精度,如
①double类型转为float类型,有效位数降低,值可能超出目标类型的取值范围,此时,结果将是不确定的;
②浮点型转换成整型,小数部分丢失,值可能超出目标类型的取值范围,此时,结果将是不确定的;
③较大的整型转为较小的整型,值可能超出目标类型的取值范围,通常只复制右边的字节;
将0赋给bool变量时,将被转换为false;而非零值将会被转换为true;

以{}方式初始化时进行的转换
将使用大括号的初始化称为列表初始化,这种初始化常用于给复杂的数据类型提供值列表,它对转换类型的要求更严格;即列表初始化不允许缩窄,即变量的类型可能无法表示赋给它的值,如不允许将浮点型转换为整型;

表达式中转换
当同一个表达式中包含两个不同的算术类型时,将会怎么样转换?它有两种自动转换:
①首先,一些类型在出现时便会自动转换
在计算表达式时,C++将bool,char,unsigned char,signed char和short的值转换为int,true被转换为1,false被转化为0,这叫做整型提升;

将不同类型进行算术运算时,也会进行转换;如int和float相加时,当涉及两种类型时,较小的类型会被转换成较大的类型;


传递参数时的转换
C++将对char和short应用整型提升;将float提升为double;

强制类型转换
强制类型转换的格式有两种,如int转化为long-->(long) a或者long (a);
强制类型转换不会修改a变量本身,而是创建一个新的,指定类型的值;

C++与java对于类型转换的不同之处在于,较高类型向目标较低类型转换时,C++会自动转换,而java需要强制转换;

auto声明
编译器能够根据初始值的类型推断出变量的类型;如果使用auto关键字,而而不指定变量的类型,编译器将把编译器的类型设置成与初始值相同;

转载于:https://my.oschina.net/u/3491256/blog/1486594

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值