- 包含标准库的头文件时,使用尖括号(<>)包围文件名。对于不属于标准库的头文件,则使用双引号("")包围
在测试程序时,可以在控制台(windows 下的cmd)使用文件重定向,将infile中内容当作输入,输出结果到outfile中。这两个文件都处于当前目录
$ test.exeoutfile
- 点运算符(.)左侧运算对象必须是一个类类型的对象,右侧运算对象必须是该类型的一个成员名
- 算术类型尺寸:long long >= long >= int >= short
- 当知道数值不可能为负,使用无符号类型
- 使用 int 执行整数运算。在实际应用中,short 常常显得太小而 long 一般和 int 有一样的尺寸。如果数值超过了int的表示范围,选用 long long。
- 在算术表达式中不要使用 char 或 bool,只有存放字符或布尔值时才使用他们。因为类型 char 在一些机器上是有符号的,而在另一些机器上又是无符号的,进行运算特别容易出问题。如果需要使用一个不大的整数,那么明确指定它的类型是 signed char 或者 unsigned char。
- 执行浮点数运算选用 double 。因为 float 通常精度不够且双精度浮点数和单精度浮点数的计算代价相差无几。事实上,对于某些机器来说,双精度运算甚至比单精度还要快。long double提供的精度一般是没必要的,况且带来的运行时消耗也不容忽视。
- 非布尔类型的算术值赋给布尔类型,初始值为 0 则为 false,否则为 true。
- 布尔值赋给非布尔类型时,初始值为 false 则结果为 0,初始值为 true 则结果为1
- 浮点数赋给整数类型,进行近似处理,结果值仅保留浮点数中的小数点之前的部分
- 赋给无符号类型一个超过它表示范围的值,结果是初始值对无符号类型表示数值总数取模后的余数。例如,8 比特大小的 unsigned char 可以表示 0 至 255 区间的值,如果赋一个区间以外的值,则实际结果是对 256 取模后的余数。因此将 -1 赋给 8 比特大小的 unsigned char 所得到的结果是 255
- 赋给带符号类型一个超出表示范围的值时,结果时未定义的(undefined)。可能崩溃或继续运行或生成错乱的数据
- 应避免依赖于实现环境的行为。如果把 int 的尺寸当作确定不变的已知值,那么这样的程序就称作不可移植的(nonportable)
- 当程序的某处使用了一种算术类型的值而其实所需的另一种类型的值时,编译器会执行类型转换。
- 当一个算术表达式中既有无符号数又有 int 值时,那个 int 值就会变成无符号数。所以切勿混用带符号类型和无符号类型
一个形如42的值被称作字面值常量(literal)。每个字面值常量都对应一种数据类型
默认情况下:
- 十进制的字面值是符号数
- 八进制和十六进制字面值可能是带符号也可能是无符号的。
- 十进制字面值是 int 、long 和 long long 中尺寸最小的那个,前提是当前的值在该类型范围内
- 八进制和十六进制字面值的类型是能容纳其数值的 int 、unsigned int 、 long 、 unsigned long 、long long 和 unsigned long long 中尺寸最小者。
- short 没有对应字面值
- 浮点型字面值是 double
- 由单引号括起来的一个字符称为 char 型字面值
- 双引号括起来的零个或多个字符构成字符串型字面值,实际为由常量字符构成的数组,编译器会在每个字符串结尾处添加一个空字符(’ ’)
- 如果两个字符串字面值位置紧邻且仅由空格、缩进和换行符分隔,则实际是一个整体
广义转义序列的形式为 x 后紧跟 1 个或多个十六进制数字,或者 后紧跟1个、2个或3个八进制数字。如果超过三个则只有前三个数字构成转义序列。
指定字面值的类型通过添加前缀和后缀可以改变字面值的默认类型,建议尽量使用大写 L, 因为小写的 l 和 1 有时候很难分清
变量提供一个具名的、可供程序操作的存储空间。初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代。
int units_sold{0};
花括号初始化被称为列表初始化,如果使用该初始化且初始值存在丢失信息的风险,编译器将报错。如果定义变量没有指定初值,则变量被默认初始化,此时变量被赋予“默认值”
- 如果内置类型的变量未被显示初始化,值由定义的位置决定。
- 定义在函数体外的变量被初始化为 0
- 定义在函数体内的内置类型变量将不被初始化,值是未定义的
- 每个类各自决定其初始化对象的方法,且是否允许不经初始化就定义对象也由类自己决定。绝大多数类支持无须显示初始化而定义对象,这种类会提供一个合适的默认值。
C++语言支持分离式编译机制,该机制允许将程序分割为若干个文件,每个文件可被独立编译。声明使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。而定义负责创建与名字关联的实体。
- 如果想声明一个变量而非定义它,就在变量名前添加关键字 extern,且不要显示地初始化变量。如果在函数体内部试图初始化一个由 extern关键字标记的变量将引发错误。
extern int i;
- 变量只能被定义一次,但可以被多次声明。
- 定义所有花括号之外的名字拥有全局作用域
- 定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。且该绑定不会改变。
- 引用不是对象,所以不能定义引用的引用
- 引用的类型要与绑定的对象严格匹配,且只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定
和引用不同:
- 指针本身是个对象,允许赋值和拷贝,且在指针的生命周期内可以先后指向几个不同的对象
- 指针无需在定义时赋值,且不被初始化的话,也会有个不确定的值
获取某个对象的地址使用取址符(&)
int *p = &ival;



