您的位置:首页 > 编程语言 > C语言/C++

查漏补缺——C/C++基本类型

2016-06-23 22:43 274 查看
趁着这段时间,把《C++ primer》重新翻看了一遍,记录下一些不熟悉的知识点。比较琐碎,就当是自己的学习笔记

1、当我们赋值给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。

unsigned char c=-1; //假设char占8bit,c的值为255

当我们赋值给带符号类型一个超出它表示范围额值时,结果是未定义的,此时,程序可能继续工作、可能崩溃,也可能生成垃圾数据。
signed char c2=256; //假设char是8bit的,c2的值是未定义的

提示:切勿混用带符号类型和无符号类型
如果表达式里既有带符号类型又有无符号类型,当带符号类型取值为负时会出现异常结果,这是因为带符号类型会自动地转换为无符号类型。

 2、如果定义变量时没有指定初始化,则变量被默认初始化。

如果是内置类型的变量未被显示初始化,它的值由定义的位置决定:定义于任何函数体之外的变量被初始化为0;定义在函数体内部的内置类型变量将不被初始化,此时变量的值时不确定的。建议初始化每一位内置类型的变量。

类的对象如果没有被显示初始化,则其值由类决定。

3、变量的声明和定义

为了支持分离式编译,C++语言将声明和定义区分开来。声明使得名字为程序所知,一个文件想要使用别处定义的名字则必须包含对那个名字的声明。而定义负责创建与名字关联的实体。

如果要在多个文件中使用同一个变量,则必须将声明与定义分离。此时,变量的定义必须出现且只能出现在一个文件中,为其他用到该变量的文件必须对其进行声明,却决不能重复定义。如果想声明一个变量为不是定义它,就在变量名前添加关键字extern,而且不要显示地初始化变量。因为如果extern语句包含了初始值的话就是定义而不是声明了。在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误。

4、指针&引用

引用必须初始化,一旦初始化完成,它将与它的出事对象一直绑定在一起,而无法重新绑定在另一个对象上。

注意:引用本身不是一个对象,所以不能定义引用的引用或指向引用的指针。

指针本身就是一个对象,所以与引用不同,无需再定义时赋初值,也可以对指针进行拷贝和赋值,可以先后改变所指的对象。值得注意的是:在声明语句中指针的类型实际上被用于指定它所指向对象的类型,所以二者必须匹配。

建议:初始化所有的指针,并且在可能的情况下,尽量等定义了对象之后再定义指向它的指针,如果实在不清楚指针应该指向何处,就把它初始化为nullptr(表示空指针)(C++11新标准)或者0,尽量避免使用NULL。

5、指向常量的指针或引用,不过是指针或引用“自以为是”罢了,他们觉得自己指向了常量,所以不自觉地不去改变所指对象的值,但是没有规定那个对象是不是一个常量和能不能通过其他途径改变。

int i=42;
int &r1=i;
const int &r2=i;
r1=0; //正确,r1并非常量引用
r2=0; //错误,r2是一个指向常量的引用(简称常量引用)

const指针(常量指针,它的值永不改变):
int errNum=0;
int *const curErr=&errNum; //curErr将一直指向errNum
const double pi=3.14159;
const double *const pip=π

把*放在const关键字之前用以说明指针是一个常量,不变的指针本身的值而不是指向的那个值。
用名词顶层const表示指针本身是个常量,名词底层const表示指针所指的对象是一个常量。在执行对象的拷贝操作时,顶层const不受什么影响,但是底层const的限制不能忽略,拷入和拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换,一般非常量可以转换为常量。

常量表达式:能在编译时计算并获得结果的表达式。

6、decltype类型指示符

它的作用是选择并返回操作数的数据类型。

decltype((variable))(注意是双括号)的结果永远是引用(给变量加上括号,编译器就会把它看做一个表达式,变量是可以作为赋值语句左值的特殊表达式,这样decltype就会得到引用的类型),而decltype(variable)的结果只有当variable本身是一个引用时才是引用。

const int ci=0,&cj=ci;
decltype(ci) x=0; //x的类型是const int
decltype(cj) y=x; //y的类型是const int&,y绑定到变量x
decltype(cj) z; //错误,z是一个引用,必须初始化

int i=42,*p=&i,&r=i;
decltype(r+0) b; //r+0的结果是int,因此b是一个未初始化的int
decltype(*p) c; //错误:c是int&,必须初始化
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: