C++编程(2)TangXiaosheng北京邮电大学电信工程学院BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn第四章类型和声明o类型o布尔量o字符类型o整数类型o浮点类型o大小ovoido枚举o声明o忠告o练习BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn4.1类型oC++中,每个名字都有一个与之相关联的类型,类型决定了可以对其进行什么样的操作,并决定这些操作如何解释o基本类型有:o布尔、字符、整数、浮点、枚举、void、指针、数组、引用、数据结构和类o可以分为内部类型和用户自定义类型BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn4.2布尔量(bool)o布尔量bool,可以具有两个值false或者true之一,用于表示逻辑运算的结果。o根据定义true=1,false=0,实际:非0即trueobool变量和整数(包括指针)可以相互转换voidf(inta,intb){boolbl=a==b;//…}boolb=7;inti=true;voidg(){boola=true;boolb=true;boolx=a+b;booly=a|b;}BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn4.3字符类型o类型为char的变量可以保存具体实现所用的字符集里面的一个字符o常用字符类型都至少包括8bit,可以保存256种不同的数值o字符集一般都采用ISO-646的某个变形,比如说ASCII(ANSI3.4-1968)BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn以下假设都是不安全的o8位字符集中共有不超过127个字符(有的字符集提供了255个字符)o不存在超出英语的字符(大部分欧洲语言提供了更多的字符)o字母字符是连续排列的(EBCDIC在”i”和”j”之间留有空隙)o写C++所需要的每个字符都是可用的(有些国家的字符集中没有提供{}[]\,C++提供的解决方法有关键字、二联符和三联符)BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn解决受限的字符集关键字(keywords)C++二联符(digraph)C++三联符(trigraph)Candand_eqbitandbitorcomplnotoror_eqxorxor_eqnot_eq&&&=&|~!|||=^^=!=%%::%:%:%:{}[]###??=??(????/??)????’??!??-#[{\]}^|~BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cndigraphandtrigraphExamples使用C的trigraph#includestdio.hvoidmain(intargc,char*argv??(??))??if(argc1&&argv??(0??)!=NULL)printf(Hello,%s!??/n,argv??(1??));elseprintf(Hello,world!??/n);return0;??使用C++的digraph#includestdio.hmain(intargc,char*argv::)%if(argc1andargv:0:!=NULL)printf(Hello,%s!??/n,argv:1:);elseprintf(Hello,world!??/n);return0;%BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn转义字符名字ASCII名字C++名字换行符水平制表符垂直制表符退格符回车符换页符警铃符反斜线符问号单引号双引号八进制十六进制NL(LF)HTVTBSCRFFBEL\?‘“ooohhh\n\t\v\b\r\f\a\\\?\’\”\ooo\xhhhBeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn字符类型ochar,signedchar,unsignedcharochar和int之间的相互转换(由实现决定)owchar_t类型,用于保存更大的字符集里的字符,如Unicode,具体大小由实现决定,该名字来源于C语言,是一个typedefo对于字符类型可以进行算术和逻辑运算o字符文字量(字符常量),如’a’,’0’,’\n’等o宽字符文字量形式为L’ab’,引号中的字符个数由wchar_t决定,其类型是wchar_tBeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn字符类型示例八进制十六进制十进制ASCII\6\x66ACK\60\x3048‘0’\137\x05f95‘_’charv1[]=“a\xah\129”;charv2[]=“a\xah\127”;charv3[]=“a\xad\127”;charv4[]=“a\xad\0127”;大字符集\uXXXX或者\UXXXX\u1e2b\uXXXX等价于\U0000XXXXBeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn字符类型程序示例charc=255;//0xffinti=c;问题:i=?//不同的环境下数值不同解决方法:使用unsignedchar或者signedchar标明但是有些函数只接受普通char类型voidf(charc,signedcharsc,unsignedcharuc){char*pc=&uc;signedchar*psc=pc;unsignedchar*puc=pc;psc=puc;//以上四条语句均产生错误}BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn4.4整数类型o三种形式:int,signedint(signed),unsignedint(unsigned)o三种大小:shortint(short),int,longint(long)o与char不同,默认的int总是有符号的o整数文字量:7,1234,1234567890000o十六进制:0x3f八进制:022oL(大小写)结尾表示long,U(大小写)结尾表示unsigned,如:100ULBeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn4.5浮点类型o表示浮点数,即包括小数部分的数o三种大小:float,double,longdoubleo浮点文字量:1.23.230.231.1.2e10o注意:浮点文字量的中间不能出现空格o以F(大小写)结尾表示float,不加后缀缺省表示为double类型,若需要longdouble类型的数字,可以加上L(大小写)后缀BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn4.6大小oC++基本类型的某些方面是由实现确定的,比如说into为了保证程序的移植性,建议在所有的可能之处都使用标准库的功能o提供多种整数类型、无符号类型、浮点类型的原因是希望使程序员能够利用各种硬件特性。比方说:不同的硬件对不同的基础类型处理时,存储的需求、存储访问时间和计算速度方面存在明显的差异。BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn大小C++对象大小由char的大小的倍数表示,定义char的大小为1,则其他数据类型大小可以用sizeof运算符获得1=sizeof(char)=sizeof(short)=sizeof(int)=sizeof(long)1=sizeof(bool)=sizeof(long)sizeof(char)=sizeof(wchar_t)=sizeof(long)sizeof(float)=sizeof(double)=sizeof(longdouble)sizeof(N)=sizeof(signedN)=sizeof(unsignedN)BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cnnumeric_limits#includelimits#includeiostreamusingnamespacestd;intmain(){coutlargestfloat==numeric_limitsfloat::max(),charissigned==numeric_limitschar::is_signedendl;}BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn4.7voidovoid类型是一个语法上的基本类型ovoid可以用来标明一个函数并不返回数值,这可以理解为一个“伪返回类型”,可以加强语法的规范性o也可以用做指向不明类型的对象的指针的基础类型例如:voidx;//errorvoidf();void*pv;BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn4.8枚举o枚举是一种类型,可以保存一组由用户刻画的值,一旦定义,使用起来很像整数类型o例如:oenum{ASM,AUTO,BREAK};n定义三个枚举型的整数常量并赋值,默认方式下,数值从0开始nASM=0,AUTO=1,BREAK=2n枚举也可命名,如enumkeyword{ASM,AUTO,BREAK};这样产生一个新的数据类型keywordBeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn枚举类型的取值范围o如果某个枚举中的所有枚举符的值均非负,该枚举的表示范围就是”0”到”2的k次幂-1”,k是能够使得所有枚举符号都在此范围内的最小的2的幂o如果存在负的枚举符号值,该枚举的取值范围就是”负2的k次幂”到”2的k次幂-1”之间enume1{dark,light};//0:1enume2{a=3,b=9};//0:15enume3{min=-10,max=1000000};//-1048576:1048575BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn枚举数值和整数之间的转换o一个整型数可以显式地转换到一个枚举值(前提是转换的结果位于该枚举范围之内,否则是无定义的)o默认情况下,枚举值可以转换到整数参加算术运算,此外,由于枚举是用户自定义类型,用户可以为枚举定义自身的操作,例如定义++或者BeijingUniversityofPosts&Telecommunicationsyoung@buptnet.edu.cn枚举数值转换示例enumflag{x=1,y=2,z=4,e=8};//0:15flagf1=5;//wron