C++ 基本操作
变量和基本类型
基本内置类型
- 使用过程中如果
int
的数值范围太小,那就选择long long
- 当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。例如,8比特带下的
unsigned char
表示的是0-255区间内的值,如果我们对它赋值-1,其结果是该值对256取模后的余数,为255。 - 而当我们赋给带符号类型一个超出它表示范围的值时,结果是未定义的。可能引起程序崩溃。
- 如果表达式中出现了带符号数与无符号数的混用,那么带符号数会被自动的转换成无符号数,并且当带符号数为负值时,会因为无符号数的取模而发生错误。
- 如果两个字符串字面值位置紧邻而且仅由空格、缩进、换行符组成,那么他们事实上是一体的。当书写的字符串的字面值比较长,写在一行里不太合适的时候可以分开书写,例如
std::cout<<"a really, really, long"
"sentence"<<std::endl;
转义字符
字符 | 含义 |
---|---|
\v |
纵向制表符 |
\b |
退格符 |
\" |
双引号 |
\' |
单引号 |
\? |
问号 |
\\ |
反斜杠 |
\x +任意位数16进制数字 |
由字符集决定的某字符 |
\ +1-3位8进制数字 |
由字符集决定的某字符 |
注意中间没有
变量声明和定义
- 变量的声明使得没名字为程序所知,一个文件如果想使用别处定义的名字,则必须包含对那个名字的声明。
- 定义负责创建于名字关联的实体
- 变量声明规定了变量的类型和名字,在这一点上定义与声明相同。但是除此以外,定义还申请存储空间,也可能会给这个变量赋一个初始值
- 如果想要声明一个变量而非定义它,加载变量名前面添加关键字extern,而且不要显示的初始化变量。因为任何包含了显式初始化的声明就是定义。我们可以给由extern关键字标记的变量赋一个初始值,但是这么做也就抵消了extern的作用
- 在函数体内部,如果试图初始化一个(已经在之前)由extern关键字标记的变量,将引发错误,因为变量能且只能被定义一次,但是可以被多次声明。
作用域
- 作用域中一旦声明了某个名字,它所包含的所有作用域中都能访问该名字。同时,允许在内层作用域中重新定义外层作用域中已有的名字,并且在该内层作用域中原来的名字被这个新变量屏蔽。
- 如果我们需要在内层作用域中访问一个被屏蔽的全局作用域的变量,可以使用域作用运算符
::
来覆盖默认的作用域规则。因为全局作用域本身并没有名字,左侧为空就表示访问全局作用域中的某个元素。但是我们最好不要定义一个与全局变量同名的局部变量
指针与引用
引用
- 定义引用时,程序会把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。因为无法令引用重新绑定到另外一个对象,引用必须初始化。
- 引用并非对象。引用只是为一个已经存在的对象所起的另外一个名字
指针
- 指针最好初始化。用一个未初始化的指针来存储某个变量的值是极其危险的。由于定义在函数内部的内置变量将不被初始化,指针所指向的位置是随机的,很可能指向的位置没有访问权限(如系统底层数据存储空间),试图改变该空间数据的值将引发未知错误
- 指针之间的初始化、拷贝尤其注重底层const的一致性或者可转化性。不能用一个普通指针指向一个const类型的数据,但是可以用一个指向const类型的指针(底层const)指向一个非const类型的数据,因为非const类型可以直接转化成const类型,反之则不行。
定义一个指向指针的引用:
int *p