一、无符号和与符号
给一个无符号类型赋一个超出其表示范围的值时,结果是范围总数和这个值取余
给一个有符号的类型赋一个超出其范围的值时,结果是未定义。
当有符号类型和无符号类型做运算时,都会先转成无符号数(负数会先被加上范围总数)
二、对于字符串
编译器会在每个字符串的结尾处添加一个空字符(‘\0’),字符串字面值的类型实际长度要比它的内容多1,例:字面值’A’表示的就是单独的字符A、而字符串”A”则代表了一个字符的数组,该数组包含两个字符:一个是字母A、另一个是空字符。
三、对于字符串字面值
\用来转义的时候
\后面若直接跟数字,则为八进制的数字(最多三位),如\115即是M
\后面也可跟16进制,如\x4d也是M
其他常用:
\12 换行符 \40 空格 \0 空字符
还可通过添加前缀或后最改变字面值类型:
例:
L’a’ //宽字符型字面值
3.14159L //扩展精度浮点型字面值
三、定义了但是没被显式初始化的变量,它的值是什么
如果是内置类型的变量未被显式初始化,它的值由定义的位置决定;若是全局变量,则默认为0,若是函数内的变量,则其实在赋值之前是不可用的。
如果是非内置类型的变量未被显示初始化(例string型),则可能在赋值之前无论在内在外都是不可用的。
四、关于变量的命名
C++的标识符由字母、数字、下划线组成,其中必须以字母或下划线开头,对大小写敏感。
用户自定义的标识符不能连续出现两个下划线
五、关于指针
(1)生成空指针的三个方法:
生成空指针:
1、int *p =nullptr
2、int *p =0
3、int *p =null(尽量不用)
(2)指针的引用:
int i =42;
int *p;
int *&r =p;//r是一个指针p的引用//要理解r的类型是什么,最简单的办法就是先读
//离r最近的定义,即&
r=&i;//相当于将指针p指向i
*r=0;//相当于i=0
六、const
const对象初始化时必须赋值
如果利用一个对象去初始化另一个对象,则他们是不是const对象都无关紧要
关于常量、引用、初始化:
int i =42; const int &r1=i;//正确,允许将const int& 绑定到一个普通int对象上 const int &r2=42;//正确,r2是一个常量引用 const int &r3=r2;//正确,r3是一个常量引用 int &r4=r2;//错误 int &r4=r1*2;//错误
个人理解:
如果是非常量引用只能绑定非常量,如果是常量引用,则在等号的右边可以是任意的,可以是非常量变量(只会取当前值),可以是数值,可以是常量对象。简单点来记呢,就是,非常量引用不可以绑定常量(因为不可以通过引用改变常量),对于常量引用呢,我觉得差不多可以说相当于宏定义define的作用,初始化时只要等号右边是一个数值就可。(所述的常量引用、非常量引用应理解为对常量的引用、对非常量的引用)
七、const+指针
const double pi = 3.14;
double *ptr =&pi//错误,ptr是普通指针,不可指向常量
const double *cptr =π//正确
*cptr =42;//错误,不可以改变常量
double dval =3.14;//
cptr =&dval;//正确,可以重新指向其他变量,但是依旧不能通过该指针改变该指针指向的值
个人理解
对于指针也一样,常量值必须只能由const int指针指向,表明指向的值是常量,直接修改或者通过指针修改都是不允许的。但是常量指针可以重新指向其他变量
指向常量的指针 const int *p :指向的值为常量,不可改变
常量指针 int *const p :指针本身所存的地址不可改变,将一直指向某个变量
常量指针必须在初始化的时候就赋地址。
八、顶层const和底层const
const也分顶层const和底层const,顶层const是指对象本身是常量,不能被改变;底层const是指向的对象是常量,恰好指针有两层const。
int num = 5;
const int* i = #
//底层const,把指向的对象看作常量,不能通过*i来改num的值int *const j = #
//顶层const,指针j本身就是常量,不能将j指向别的东西了。