1、读入未知数目的输入
不知道具体有多少数值,只是要一直读数直到程序输入结束。使用的程序有:
while( std::cin >> value )
{
sum+=value;
}
2、写有参数的函数时,首要工作,就是要对传进来的所有参数进行合法性检查。而对于传出的参数也应该进行检查,这个动作当然应该在函数的外部,也就是说,调用完一个函数后,应该对其传出的值进行检查。
常用的检查语句有:if{}else{};switch{};
3、文件结束符
windows系统下通过键入【ctrl】+【z】键来输入文件结束符;
unix系统中,通常用【ctrl】+【d】键
4、C++算术类型
类型 |
含义 |
最小存储空间 |
取值范围 |
备注 |
Bool |
布尔型 |
----- |
True 、false |
|
char (unsigned char) (signed char) |
字符型 |
8位 |
0~255 (-128~127) |
|
wchar_t |
宽字符型 |
16位 |
||
short (unsigned short) |
短整型 |
16位 |
默认为带符号 (无符号数) |
|
int (unsigned int) |
整形 |
16位 |
0~65535 |
默认为带符号 (无符号数) |
long (unsigned long) |
长整形 |
32位 |
0~232 |
默认为带符号数(无符号数) |
float |
单精度浮点型 |
32位,6位有效数字 |
||
double |
双精度浮点型 |
64位,10位有效数字 |
||
long double |
扩展精度浮点型 |
96或128位,10位有效数字 |
||
024 |
八进制数 |
|||
0x14 |
十六进制数 |
|||
对于数据类型应注意的问题:
1)越界问题,通常是取值数目取模,然后取所得值;
2)对于unsigned类型来说,负数总是超出其取值范围,unsigned类型的对象可能永远不会保存负数;
3)选择类型前,要先了解程序的细节(是否越界,运行时性能代价)。
5、变量名
变量名,即变量的标识符,可以由字母、数字和下划线组成。变量名必须以字母或下划线开头,并且区分大小写。
变量名得命名规则:
1)变量名不能与关键字重名;
2)不能与各种操作符的替代名重名;
3)不能包含两个连续的下划线,也不能以下划线开头后面紧跟着一个大写字母。
4)有些标识符(在函数外定义的标识符)不能以下划线开头。
较好的命名规范:
1)变量名一般用小写字母;
2)标识符应使用能帮助记忆的名字,能够提示其再程序中的用法的名字;
3)包含多个词的标识符书写为在每个词之间添加一个下划线,或者每个内嵌的词的第一个字母都大写;
4)在类中的数据成员,一般采用“d_变量名 ”较好,类名一般用“C类名”等;
6、声明和定义
1)变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义;
2)声明用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。
3)使用extern关键字声明变量名而不是定义它。
4)声明不分配存储空间,只有定义才分配;
5)声明可以有多个,但是定义有且仅有一个。
6)任何在多个文件中使用的变量都需要有与定义分离的声明,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定义:如全局变量)。
7、const限定符
for循环的三个例子,说明在使用循环或者变量时,应该注意的地方。
1)for( int index = 0 ; index != 512 ; ++index )
2)int bufsize = 512 ;
for( int index = 0 ; index != bufsize ; ++index )
3) const int bufsize =512 ;
for( int index = 0 ; index != bufsize; ++index )
其中:方式1中,512的含义不明称为魔数,而且在后期维护过程中非常麻烦,对512的修改必须在使用的地方全部修改到,才能保证程序不易出错,维护的成本高;
方式2:使用bufsize代替512,则维护起来方便,只需要修改其定义就可以保证程序在其他地方使用该数也被修改,但不足的地方就是:在程序中可能不注意的时候会修改bufsize的值;
方式3:使用const将bufsize定义为字面值常量,这样在程序的其他地方就不能修改改值,保存很好的一致性。
定义const对象
1)const对象默认为文件的局部变量
在全局作用域里定义非const变量时,它在整个程序中可以访问;
//file1.c
int counter;
//file2.c
extern int counter;
++counter;
与其他变量不同,除非特别说明,在全局作用域声明的const变量时定义该对象的文件的局部变量,此变量只存在于那个文件中,不能被其他文件访问。
通过制定const变量为extern,就可以在整个程序中使用const对象。
//file1.c
extern int bufsize = fcn();
//file2.c
extern int bufsize ;
for( int index = 0 ; index != bufsize ; ++index )
【 注解 】 非const变量默认为extern。要使const变量能够在其他文件中访问,必须显示地指定它为extern。
8、引用
1)引用是一种复合类型,通过在变量名前添加“&”符号来定义。
2)每一种引用类型都“关联到”某一其他类型。不能定义引用类型的引用,但可以定义任何其他类型的引用。
3)引用必须用该引用同类型的对象初始化。
4)引用是它绑定的对象的另一个名字,作用在引用上的所有操作事实上都是作用在该引用绑定的对象上。
5)引用在定义时必须初始化,初始化是指明引用指向哪个对象的唯一方法。
6)const引用(为只读,不能修改其引用,如不能修改refval,对refval赋值都是非法操作)
a)const引用可以绑定到const对象,也可以绑定到非const对象,使其值不被修改;
b)非const引用不能绑定到const对象上。
const int ival = 1032;
const int &refval = ival ; //ok,指向const对象的引用
int &ref2 = ival; //error,非const引用,不能用来指向const对象。
9、typedef名字
使用typedef的目的
1)为了隐藏特定类型的实现,强调使用类型的目的;
2)简化复杂的类型定义,使其更易理解;
3)允许一个类型用于多个目的,每次使用使该类型的目的明确。
typedef使用的一些注意事项:
1)其为一个已存在类型的别名,使人不容易知道实际的类型,造成理解的失误。
2)将typedef声明嵌入到类中,以避免影响全局名称空间,并使它们更容易查找到。
3)在定义复杂的函数参数时类型别名可以起作用。
10、枚举类型
需要为某些属性定义为一组可选择的值,例如,文件打开的状态可能会有三种:输入、输出和追加。记录这些状态值的一种方法是使每一种状态都与一个唯一的常数值相关联。
枚举,不但定义了整数常量集,而且还把它们聚集成组。
eg:enum open_modes { input , output , append };
枚举类型的特点
1)默认地,第一个枚举成员赋值为0;后面的每个枚举成员赋的值比前面的大1;
2)可以为一个或多个枚举成员提供初始值,但必须是常量表达式;
3)枚举成员值可以是不唯一的;
4)每个enum都定义了一个新的类型,可以定义和初始化枚举类型的对象
5)枚举类型对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行。
eg enum Points { point2d = 2 , point2w ,
point3d =2 , point3w }
Points pt2d = point3d; //ok,point3d is a points enumerator(枚举成员)
Points pt2w = 3; //error
pt2w = polygon; //error,polygon is not a points enumerator
pt2w = pt3d ; // ok, both are objects of points enum type.