1、C++具体实现分宿主式和独立式。

2、数值类型转换成逻辑类型,0为false,非0为true。指针也可以隐式转换,非空指针为true,nullptr为false。
3、char是8字节所容纳的256个值,可看成0~255,或-127~127,而不是-128~127。因为c++标准支持使用补码的硬件设备,而补码会排除掉一个值,-128不容易移植。
4、strcmp()只能接受普通char。
5、转义字符

6、精细控制整数的尺寸,使用 <cstdint>
中定义的别名,int64_t(明确占用64位的带符号整数),uint_fast16_t(至少占用16位的无符号整数,最快整数)和int_least32_t(至少占用32位的带符号整数)等。
7、通常情况下,整数字面值常量类型由它的形式、取值和后缀共同决定:

8、前后缀限定字面值常量的类型,下表的“字符串”指“字符串字面值常量”而非数据类型"std::string"

9、后缀l和L可以与u和U结合使用,表达unsigned long,同样后缀l和L也能用于表示浮点数表示字面值常量类型,lond double。
10、void作用:作为函数返回类型说明函数实际不返回任何实际的值;作为指针的基本类型部分表明指针所指对象的类型未知【声明指针时】。
11、C++基本类型尺寸规定:

最后一行的N可以是char、short、int、long或long long。
12、如果某个值v能用T类型的变量确切表达,则把v的类型转换成T是值保护的。最好避免使用那些做不到值保护的类型转换。
13、alignof()运算符返回实参表达式对齐的情况。有时需在声明语句中对齐,但不允许形如alignof(x+y)的表达式免责使用类型说明符alignas:alignas(T),含义是“像T那样对齐”。
14、每个名字可以对应多个声明,但只能一个定义
15、一条声明语句(依次)包含5个部分:


16、修饰符是指声明语句最开始的关键字,如virtual,extern和constexpr等,作用是指定所声明对象的某些非类型属性。
常见声明运算符:

声明语句不允许省略数据类型。
17、关键字表

18、块内声明的名字能隐藏外层块及全局作用域中的同名声明。可用作用域解析符::访问被隐藏的全局名字。
19、列表初始化可防止窄化转换,即:
- 如果一种整型存不下另一种整型的值,则后者不会被转换为前者。例char到int,不允许int到char转换。
- 一种浮点型存不下另一种浮点型的值,则后者不会被转换为前者。例如float到double,但不能double到float
- 浮点型不能转换成整型
- 整型不能转换为浮点型
20、使用auto和初始化器,应该选择=的初始化形式,不然造成推断不是想要结果。
auto z1 {99};//类型initializer_list<int>
auto z2 = 99;//类型int
21、除非用充分理由,否则最好使用{}初始化。空{}初始化表示默认值初始化。
22、除非确定未初始化缓冲区远优于初始化缓冲区,否则不要轻易让缓冲区处于未初始化状态。
23、不指定初始化器,全局变量、名字空间变量和局部static变量和static成员将会执行相应数据类型的列表{}初始化[静态对象]。局部变量和自由存储上的对象[堆或动态对象],除非位于用户自定义类型的默认构造函数中,否则不会执行默认初始化。对内置类型的局部变量或者用new 创建的内置类型的对象执行初始化,用{}。
24、C++推断类型机制:
- auto,根据对象的初始化器推断对象的数据类型,可能是变量、const或者constexpr的类型
- decltype(expr)推断的对象不是一个简单的初始化器,有可能是函数的返回值类型或者类成员类型。
25、表达式类型永远不会是引用类型,因为表达式会隐式地执行解引用操作。
void g(int &v){
auto x = v;//x类型为int
auto& y = v;// y的类型是int&
}
26、既想推断得到类型,又不想在此过程中定义一个初始化变量应使用声明类型修饰符decltype(expr)。推断所得的结果是expr的声明类型。
27、对象是指一块连续存储区域,左值是指想对象的一条表达式。“左值”的字面意思是“能用在赋值运算符左侧的对象”,但并非所用左值都能用在赋值运算符的左侧,左值也有可能指示某个常量。
28、未被声明成const的左值称为可修改的左值。
29、右值是指“不能作为左值的值”,例函数返回值一样的临时值。

30、后缀_t表示类型别名。不允许在类型别名前加修饰符。