CPrimer第三章第六章个人总结.doc_第1页
CPrimer第三章第六章个人总结.doc_第2页
CPrimer第三章第六章个人总结.doc_第3页
CPrimer第三章第六章个人总结.doc_第4页
CPrimer第三章第六章个人总结.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章 数据处理1、 一些命名规则在名称中只能使用字母字符、数字和下划线(_)名称的第一个字符不能是数字区分大写字符与小写字符不能将C+关键字用作名称以两个下划线或下划线和大写字母打头的名称被保留给实现(编译器及其使用的资源)使用。以一个下划线开头的名称被保留给实现,用作全局标示符。但是_time_stop或_Donut这样的名字不会导致编译器错误,而会导致行为的不确定性。C+对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台有长度限制。2、 整形有的类型(无符号类型)不能表示负值。术语宽度(width)用于描述存储整数时使用的内存量。C+的基本整型分别是(按宽度递增的顺序排列)char、short、int、long和C+11新增的long long。其中每种类型都有符号版本和无符号版本。因此总共有10中类型可选择。3、 整型short、int、long和long longshort至少16位int至少与short一样长long至少32位long long至少64位,且至少与long一样长当前很多系统都使用最小长度,即short16位,long32位。这仍然为int提供了多种选择,其宽度可以使16位,24位或32位,同时又符合标准。甚至可以使64位,因为long和long long至少长64位。老式系统的实现中,int宽度为16位(与short相同。)现在的WindowsXP、Windows Vista、Windows7等都为32位(与long相同)。如果知道变量可能表示的整数大于16位整数的最大可能值,则使用long。即使系统上int为32位,也应这样做。这样,将程序移植到16位系统时,就不会突然无法正常工作。4、 位与字节计算机内存的基本单元是位(bit),可将其看做电子开关(0、1)。字节(byte)通常指的是8位的内存单元。从这个意义上说,字节指的就是描述计算机内存量的度量单位,1KB等于1024字节。C+对字节的定义与此不同。C+字节由至少能够容纳实现的基本字符集的相邻位组成。也就是说,可能取值的数目必须等于或超过字符数目。5、 sizeofsizeof运算符指出,在使用8位字节的系统中,int的长度为4个字节。可对类型名或变量使用sizeof运算符。对类型名(如int)使用sizeof,应将名称放在括号中。对变量名(如n_short)使用sizeof,括号是可选的。6、 无符号类型unsigned本身是unsigned int的缩写。如果超越了限制,其值将为范围另一端的取值。对short变量sam,sam为32767,加1之后变为-32768.而对无符号变量sue,sue为0,减1之后变为65535.7、 const限定符#define语句,定义常量预处理器方法。但是C+有一种更好的方法,即使用const关键字来修改变量声明和初始化。加入需要一个表示一年中月份数的符号常量,可用const int Months = 12;常量(如Months)被初始化之后,其值就固定了,编译器将不允许再修改该常量的值。应在声明中对const进行初始化。如果在声明常量时没有提供值,则该常量的值将是不确定的,且无法修改。为什么const比#define好?(1) 首先,它能够明确指定类型。(2) 其次,可以再使用C+的作用域规则将定义限制在特定的函数或文件中。(3) 第三,可以将const用于更复杂的类型,如数组,结构和类。8、 浮点类型C+有三种浮点类型:float、double和long double。这些类型是按它们可以表示的有效数为和允许的指数最小范围来描述的。有效位:数字中有意义的位。有效位数不依赖于小数点的位置。float至少32位,double至少48位,且不少于float,long double至少和double一样多。这三种类型的有效位数可以一样多。然而,通常,float为32位,double为64位,long double为80、96或128位。这三种类型的指数范围至少是-3737。浮点数有两大优点:首先,它们可以表示整数之间的值。其次,由于有缩放因子,它们可以表示的范围大得多。浮点数的缺点:浮点运算的速度通常比整数运算慢,且精度将降低。9、 C+算数运算符%运算符求模。两个操作数都必须是整型,将该运算符用于浮点数将导致编译错误,如果其中一个是负数,则结果的符号满足(a/b)*b+a%b = a。float hats = 50.24; float heads = 11.17; couthats+headsendl;11.17+50.25=61.42,但是cout输出的是61.419998。这不是运算问题,而是由于float类型表示有效位数的能力有限。对于float,C+只保证6位有效位。如果将61.419998四舍五入成6位,将得到61.4200,这是保证精度下的正确值,要使用更高的精度,应使用double或long double。10、 运算符优先级和结合性当两个运算符的优先级相同时,C+将看操作数的结合性,是从左到右还是从右到左。乘除法都是从左到右结合的。仅当两个运算符被用于同一个操作数时,优先级和结合性规则才有效。例如:float logs = 120/4*5; 因为乘除法结合性从做到用,所以结果为150。11、 类型转换整型提升:计算表达式时,C+将bool、char、unsigned char、signed char和short值转换为int。具体的,true被转换为1,false被转换为0。这些转换被称为整型提升。例如:short chickens = 20; short ducks = 35; short fowls = chickens + ducks;为执行第三行语句,C+程序取得chickens和ducks的值,并将它们转换为int。然后程序将结构转换为short类型,因为结果赋给一个short变量。通常将int类型选择为计算机最自然的类型,这意味着计算机使用这种类型时,运算速度可能最快。将不同类型进行算术运算时,也会进行一些转换。例如将int和float相加。当运算设计两种类型时,较小的类型将被转换为较大的类型。例如:用9.0除以5,由于9.0类型为double,因此程序使用5除之前,将5转换为double类型。C+11版本校验表:(1) 如果有一个操作数的类型时long double,则将另一个操作数类型转换为long double(2) 否则,如果有一个操作数的类型是double,则将另一个操作数转换为double。(3) 否则,如果有一个操作数的类型是float,则将另一个操作数转换为float。(4) 否则,说明操作数都是整型,因此执行整型提升。(5) 在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。(6) 如果一个操作数是有符号的,另一个操作数是无符号的,且无符号操作数的级别比有符号操作数高,则将有符号操作数转换为无符号操作数所属的类型。(7) 否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。(8) 否则,将两个操作数都换为有符号类型的无符号版本。有符号整型按级别从高到低依次为long long、long、int、short和signed char。无符号整型的排列顺序与有符号整型相同。类型char、signed char和unsigned char的级别相同。类型bool的级别最低。强制类型转换:(long) thorn或long (thorn),强制类型转换不会修改thorn变量本身,而是创建一个新的,指定类型的值。第4章 复合类型1、 数组:声明数组的通用格式:typename arraynamearraysize;表达式arraySize指定元素数目,它必须是整型常数(如10)或const值。也可以是常量表达式(如8*size(int)),即其中所有的值在编译时都是已知的。arraySize不能试变量。变量的值是在程序运行时设置的。然而new运算符可以避开这种限制。数组之所以称为复合类型,因为它是使用其它类型来创建的。sizeof运算符返回类型或数据对象的长度(单位为字节)。将sizeof用于数组名,得到的将是整个数组中的字节数。将sizeof用于数组元素,得到的将是元素的长度(单位为字节)。数组的初始化:(1) 只有在定义数组时才能使用初始化,之后就不能使用了,也不能将一个数组赋给另一个数组。int cards4 = 1,2.3,4; /Okint hand4;/Okhand4 = 1,2,3,4; /not allowedhand = cards;/not allowed然而可以使用下标分别给数组中的元素赋值。(2) 初始化数组时,提供的值可以少于数组元素数目,如float a5 = 1,2;如果只对数组的一部分进行初始化,则编译器把其他元素设置为0。(3) 将数组全部初始化为0很简单,只需显式的将第一个元素初始化为0,然后让编译器将其他元素都初始化为0,即:long a500 = 0;(4) 如果初始化数组时方括号内()为空,C+编译器将计算元素个数。例如:short a = 1,2,3,4;编译器将使a数组包含4个元素。可以通过下面方法获得数组元素个数:short things = (1,2,3,4);int num_elements = sizeof(things)/sizeof(short);(5) 初始化列表禁止缩窄转换:long a = 1,2,3.0; /not allowedchar a = a, i, 1122334, 0 /not allowed2、 字符串字符串:是存储在内存的连续字节中的一系列字符。C+处理字符串的方式有两种。第一种来自C语言,长被称为C-风格字符串(C-style string)。第二种是基于string类库的方法。存储在连续字节中的一系列字符意味着可以将字符串存储在char数组中,每个字符都位于自己的数组元素中。C-风格字符串具有一种特殊的性质:以空字符(null character)结尾,空字符被写作0,其ASCII码为0,用来表示字符串的结尾。char dog3 = a, b, c,; /not a stringchar car3 = a, b, 0; /a string这两个数组都是char数组,但只有两个数组时字符串。空字符对C-风格字符串至关重要。另一种将字符数组初始化为字符串的方法只需要用引号括起的字符串即可,这种字符串被称为字符串常量(string constant)或字符串字面值(string literal)。char bird11 = “Mr.Cheeps”; / the 0 is understoodchar fish = “Bubbles”; / let the compiler count用引用括起的字符串隐式的包括结尾的空字符,因此不用显式的包括它。应确保数组足够大,能够存储字符串中所有字符包括空字符。使用字符串常量初始化字符数组是这样的一种情况,即让编译器计算元素数目更为安全。字符串常量(使用双引号)不能与字符常量(使用单引号)互换。在ASCII系统上,S只是83的另一种写法,因此下面的语句将83赋给shirt_size:char shirt_size = S;但”S”不是字符常量,它表示的是两个字符(字符S和0)组成的字符串。更糟糕的是,“S”实际上表示的是字符串所在的内存地址。因此下面试图将一个内存地址赋给shirt_size:char shirt_size = “S”;要将字符串存储到数组中,通常有两种方法:将数组初始化为字符串常量、将键盘或文件输入读入到数组中。char name15 = “BasicMan”;strlen(name) = 8;sizeof(name) = 15;sizeof运算符指出整个数组的长度:15字节。strlen()函数返回的是存储在数组中的字符串的长度,而不是数组本身的长度。另外strlen()只计算可见的字符,而不把空字符0计算在内。如果cosmic是字符串,则要存储这个字符串,数组的长度不能短于strlen(cosmic)+1。3、 字符串输入cin。cin通过空白(空格,制表符和换行符)来确定字符串的结束位置。这意味着cin读取字符数组输入时只读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符。char name20;cout”Enter your name”name;cout”Enter your favorite dessertdessert;cout desserendl;coutnamestr;这样使用string对象更方便,更安全。理论上,可以将char数组视为一组用于存储一个字符串的char存储单元,而string类变量时一个表示字符串的实体。5、 枚举C+的enum工具提供了另一种创建符号常量的方法,这种方式可以代替const。它还允许定义新类型,但必须按严格的限制进行。使用enum的句法与使用结构相似。enum spectrumred, orange, yellow;让spectrum称为新类型的名称,spectrum被称为枚举。将red、orange、yellow等作为符号常量。默认情况下,将整数值赋给枚举量,第一个枚举量为0,第二个为1,以此类推。可以用枚举名来声明该类型变量:spectrum band;band =blue; /validband = 2000; /invalid, 2000 not an enumerator在不进行强制转换的情况下,只能将定义枚举时使用的枚举量赋给这种枚举的变量。枚举量是整型,可以被提升为int类型,但int类型不能自动转换为枚举类型。可以设置枚举量的值;:enum bitsont = 1, two = 2, four =4, eight =8;可以创建多个值相同的枚举量:enum zero, null = 0, one, numero_uno = 1;枚举的取值范围enum bitsont = 1, two = 2, four =4, eight =8;取值范围定义:首先找到上限,即枚举量最大值。找到大于这个最大值的最小的2的幂,将它减1,得到取值范围的上限。计算下线,要知道枚举量最小值,它不小于0,则取值范围的下限为0.如果小于0,与上限相同,但要加上负号。6、 指针和自由存储空间指针时一个变量,其存储的是值得地址,而不是值本身。使用常规变量时,值是指定的量,而地址为派生量。而对指针来说,将地址视为指定的量,而将值视为派生量。一种特殊类型的变量指针,用于存储值得地址。指针名表示的是地址。*运算符被称为间接值或解除引用运算符。将其应用于指针,可以得到该地址存储的值。声明和初始化指针。int * p_updates;这表明,*p_updates的类型为int。由于*运算符被用于指针,因此p_updates变量本身必须是指针,我们说p_updates指向int类型。int * p1,p2;这样的声明创建一个指针p1和一个int变量p2。对每个指针变量名,都需要使用一个*。指针变量不仅仅是指针,而且是指向指定类型的指针。可以再声明语句中初始化指针。在这种情况下,被初始化的是指针,而不是它指向的值。int higgens = 5;int * pt = &higgens;语句将pt(而不是*pt)的值设置为&higgens。指针的危险long * fellow;*fellow = 223344 /place a value in never-never land警告:一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。这是关于使用指针的金科玉律。指针和数字int * pt;pt = 0xB80000; /type mismatch这里左边是指向int的指针,因此可以把它赋给地址。但右边是一个整数。要将数字值作为地址来使用,应通过强制类型转换将数字转换为适当的地址类型:int *pt;pt = (int *) 0xB80000; types now match这样赋值语句的两边都是整数的地址。注意:pt是int值得地址并不意味着pt本身的类型是int。例如有些平台,int类型时两字节,而地址是4个字节。使用new来分配内存变量时在编译时分配的有名称的内存,而指针只是为可以通过名称直接访问的内存提供了一个别名。指针真正的用武之地在于,在运行阶段分配未命名的内存以存储值。这种情况下只能通过指针来访问内存。C语言中可以使用库函数malloc()分配内存;C+仍然可以这样做,但C+还有更好的方法new运算符。int *pn = new int;new int告诉程序,需要适合存储int的内存。new运算符根据类型确定需要多少字节的内存,然后找到这样的内存,并返回其地址。使用delete释放内存int * ps = new int;.delete ps;这将释放ps指向的内存,但是不会删除指针ps本身。可以将ps重新指向另一个新分配的内存块。一定要配对使用new和delete。不要尝试释放已经释放的内存块,这样做的结果是不确定的。不能使用delete释放声明变量(非new的)。只能用delete来释放使用new分配的内存。然而,对空指针使用delete是安全的。注意:使用delete的关键在于,将它用于new分配的内存。这并不意味着要使用用于new的指针,而是用于new的地址:int * ps = new int;int * pq = ps;delete pq; /delete with second pointer一般来说,不要创建两个指向同一个内存块的地址,因为将增加错误删除同一个内存块两次的可能性。但对于返回指针的函数,使用另一个指针确实有道理。7、 使用new来创建动态数组对于大型数据(如数组、字符串和机构)应使用new,这正是new的用武之地。如果通过声明来创建数组,则在程序被编译时将为它分配内存空间。不管程序最终是否使用数组,数组都在那里,它占用了内存。在编译时给数组分配内存被称为静态联编。使用new时,如果在运行阶段需要数组则创建它,如果不需要则不创建。还可以在程序运行时选择数组的长度,这被称为动态联编,意味着数组时在程序运行时创建的。new运算符返回第一个元素的地址。int * psome = new int10;new运算符返回第一个地址,该地址被赋给指针psome。如果使用new时,不带方括号,则使用delete时也不应带方括号。如果使用new时带方括号,则使用delete时也应该带方括号。注意:(1) 不要使用delete来释放不是new分配的内存(2) 不要使用delete释放同一个内存块两次(3) 如果使用new为数组分配内存,则使用delete来释放。(4) 如果使用new为一个实体分配内存,则应使用delete(没有方括号)来释放。(5) 对空指针应用delete是安全的。数组和指针基本等价是C和C+的优点之一。不能修改数组名的值。但指针是变量,因此可以修改它的值。8、 指针、数组和指针算数使用数组表示法时,C+都执行下面的转换:arraynamei becomes *(arrayname + i)如果使用的是指针,而不是数组名,C+也将执行同样的转换:pointernamei becomes *(pointername + i)在很多情况下,可以相同的方式使用指针名和数组名。可以使用数组方括号表示法,也可以使用解除引用运算符(*)。在多数表达式中,指针名和数组名都表示地址。区别之一是,可以修改指针的值,而数组是常量。对数组用sizeof获得的是数组的长度,而对指针使用sizeof获得的是指针的长度,即使指针指向的是一个数组。数组的地址short tell10;cout tellendl;cout &tellendl;表达式tell+1将地址值加2,而表达式&tell+2将地址加20。tell是一个short指针(*short),而&tell是一个这样的指针,即指向包含20个元素的short数组(short(*)20)short(*pas)20 = &tell; /pas points to array of 20 shorts如果要描述变量的类型,可将声明中的变量名删除。因此pas的类型为short(*)20。另外由于pas被设置为&tell,所以*pas与tell等价,所以(*pas)0为tell数组的第一个元素。9、 指针和字符串如果给cout提供一个字符的地址,则它将从该字符开始打印,直到遇到空字符为止。用引号括起的字符串像数组名一样,也是第一个元素的地址。在cout和多数C+表达式中,char数组名、char指针以及用引号括起的字符串常量都被解释为字符串第一个字符的地址。一般来说,如果给cout提供一个指针,它将打印地址。但如果指针类型为char*,则cout将显示指向的字符串。如果要显示的是字符串的地址,则必须将这种指针强制转换为另一种指针类型,如*int。假设有指针pointer,则cout(int *)pointer将显示为该字符串的地址。初始化数组时,请使用=运算符,否则应使用strcpy()或strncpy()。10、 自动存储、静态存储和动态存储在函数内部定义的常规变量使用自动存储空间,被称为自动变量,在所属的函数被调用时自动产生,在该函数结束时消亡。静态存储在整个程序执行期间都存在。是变量称为静态的方式有两种,一种是在函数外面定义它,另一个是在声明变量时使用关键字static:static double fee = 56.50;动态存储:new和delete运算符管理一个内存池,这在C+中被称为自由存储空间(free store)或堆(heap)。该内存池同用于静态变量和自动变量的内存是分开的。内存泄露:使用new在自由存储空间(或堆)上创建变量后,没有调用delete,则即使包含指针的内存由于作用域规则和对象生命周期的原因而被释放,在自由存储空间上动态分配的变量或结构也将继续存在。实际上,将会无法访问自由存储空间中的结构,因为指向这些内存的指针无效。这将导致内存泄露。11、 总结字符串时以空字符为结尾的一系列字符。字符串可用引号括起的字符串常量表示,其中隐式包含了结尾的空字符。可以将字符串存储在char数组中,可以用被初始化为指向字符串的char指针表示字符串。函数strlen()返回字符串的长度,其中不包括空字符。第五章1、 for循环测试表达式test-expression可以使用任意表达式,C+将把结果强制转换为bool类型。值为0的表达式将被转换为bool值false,导致循环结束。如果表达式值非零,将被强制转换为bool值true。for循环是入口条件循环。这意味着,在每轮循环开始之前,都将计算测试表达式的值,当测试表达式为false时,将不会执行循环体。2、 表达式和语句任何值或任何有效的值和运算符的组合都是表达式C+将赋值表达式的值定义为左侧成员的值,因此x = 20这个表达式的值为20。像xy这样的关系表达式将被判定为bool值true或false。从表达式到语句的转变很容易,只要加上分号即可。因此下面一个是表达式age = 100下面是一条语句age = 100;对任何表达式加上分号都可以成为语句,但是反过来说就不对了。也就是说,从语句中删除分号并不一定能将它转换为表达式。int toad;这是语句,但是去掉分号,int toad并不是表达式,因为它没有值。复合语句(代码块)。代码块由一对花括号和它们包含的语句组成,被视为一条语句。逗号运算符逗号运算符对表达式完成同样的任务,允许将两个表达式放到C+句法只允许放一个表达式的地方。目前为止,逗号运算符最常见的用途是将两个或更多的表达式放到一个for循环表达式中。除此之外,C+运算符规定,逗号表达式是第二部分的值。如:i = 20, j =2* i;上述表达式的值是40.在所有的运算符中,逗号运算符的优先级是最低的。如:cats = 17,240:;被解释为:(cats = 17),240 也就是说,将cats设置为17,240不起作用。cats = (17, 240); 由于括号优先级最高,表达式将把cats设置为240逗号右侧的表达式值。关系表达式不能将它们用于C-风格字符串,但可用于string类对象。C+将C-风格字符串视为地址,不能使用关系运算符,应使用C-风格字符串库中的strcmp()函数来比较。该函数接受两个字符串地址作为参数,这意味着参数可以是指针、字符串常量或字符数组名。3、递增运算符+int a ,b= 5;couta+endl; 输出的结果是5cout+bchwhile(ch != #)coutch程序在输出时将省略空格,因为cin会忽略空格和换行符。而且,发送给cin的输入将会被缓冲。这意味着只有在用户按下回车键后,它输入的内容才会被发送给程序。cin.get(ch)读取输入中的下一个字符,即使它是空格,并将其赋给变量ch。在C语言中,要修改变量的值,必须将变量的地址传递给函数。但是在C+中,可以使用引用,只需要函数将参数声明为引用即可。引用是C+在C语言基础上新增的一种类型。方法cin.get(char)的返回值是一个cin对象,然而istream类提供了一个将istream对象转换为bool值的函数,比如while(cin),while(cin.get(char)。cin.get()成员函数返回输入中的下一个字符。cin.get(char)返回一个对象,而不是读取的字符。如果使用cin.get()(没有参数)并测试EOF,必须将返回值赋给int变量,因为有些系统中,char类型时没有符号的,因此char变量不可能为EOF值(-1)。可以用while(ch =cin.get()来测试EOF,赋值语句的值为左操作数的值。8、 二维数组C+常用做法,将一个指针数组初始化为一组字符串常量。const char * cities5 = “a city”, “b city”, “c city”, “d city”, “e city”;数组的每个成员都是一个指针,一个地址,字符串也是地址。9、 总结:cinch将输入中的下一个字符读入到ch中,它将忽略空格,换行符和制表符。cin.get(ch)读取输入中的下一个字符(而不管字符是什么)并将其存储到ch中。cin.get(char)成员函数调用通过返回转换为false的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论