Chap1:
cerr: 标准错误。
clog: 输出程序的一般性信息。
cout << “ ”: “<<”运算符返回左侧对象,cin >> 也返回左侧对象。
endl: 结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。
批量注释:ctrl+K, ctrl+C; 批量取消注释:ctrl+K, ctrl+U。
for: 创建控制变量->检测->执行循环体->
++i->检测->执行循环体->
…
while(cin>>value): 遇文件结束符(ctrl+Z)或无效输入时停止。
文件重定向:允许我们将标准输入和标准输出与命名文件关联起来,P19。
成员函数:用.运算符来表达。左侧运算对象必须是一个类类型的对象,右侧运算对象必须是该类型的一个成员名,运算结果为右侧运算对象指定的成员。
Chap2:
(最小)尺寸:long long 64≥long 32(一般不用)≥int 16≥short 16; float 32(不如double); double 64;long double 96/128(一般不用)。
赋值时的类型转换:负数赋给unsigned:取模;超范围:未定义。
既有无符号又有int:int先转为无符号。
八进制:0开头;十六进制:0x开头。
字符串字面值中的空格,缩进和换行符是无意义的。
转义字符:输出既可以用’’,也可以用字符串““。
泛化的转义字符:\ooo代表八进制,\xoooo代表十六进制。
字面值后面可以加前后缀来指定是否带符号以及占用多少空间。
列表初始化特点:如果我们使用列表初始化且初始值存在丢失信息的奉献,则编译器报错。
默认初始化:定义于任何函数体之外的变量被初始化为0,定义在函数体内部的内置变量类型将不被初始化。
只声明不定义:extern。
复合类型:基于其他类型定义的类型。
声明符是跟在变量前的,不是跟在数据类型后的,且默认由右向左绑定。
定义引用要有初始值,引用不能绑字面值,不能定义引用的引用。
空指针:nullptr, 0, NULL(#include<cstdlib>)。
const默认只在文件内有效,多文件使用要分别extern const。
const对象的引用在定义时就要定义为const引用(const int &),但定义为const的引用可以绑定非const的对象,则此时不能通过此引用修改原对象,且原对象可以通过自己改变。
const对象的指针在定义时也要定义为const指针(const int *),但定义为const的指针可以绑定非const的对象,则此时不能通过此指针修改原对象,且原对象可以通过自己改变。
const指针:int *constcurErr=&errNumb。
顶层const:本身是常量;底层const:指针所指对象是常量。
执行拷贝操作时,顶层const不受影响,但底层const必须相同。
constexpr:如果认定变量是一个常量表达式,那就把它声明成constexpr类型。
constexpr指针只是顶层const,所以既可以指向常量对象也可以指向非常量。
auto对于引用:会忽略掉引用以及顶层const。
对于引用会返回顶层const和引用类型,除非使用的表达式不是一个变量,另一方面,若表达式是解引用操作则得到引用类型。
decltype((i))与decltype(i)前者一定返回引用类型。
Chap3:
getline(cin, s)与cin>>s区别。
s.size()的结果是string::size_type类型,下标运算符也是。
for(auto i:s)只能显示不能修改,若想修改s中的字符,则要用auto &i。
早期的向量套向量:vector<vector<int> >。
v2.push_back(i)。
如果循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环。
vector<int>::size_type。
不能使用下标形式向空vector添加元素。
特殊情况下如果容器为空,则begin和end返回的是同一个迭代器。
迭代器类型:vector<int>::iterator和vector<int>::const_iterator(常量指针,只能读数据不能写数据)。
difference_type:带符号整型,表示两迭代器间距。
不允许用数组=数组来赋值,也不允许用vector给数组赋值,但可以用数组初始化vector:vector<int> ivec(begin(int_arr),end(int_arr))。
数组下标:通常定义为size_t类型(cstddef头文件)。
auto ia2(数组),则ia2是指针,但decltype(数组)返回的是同大小的数组。
数组的begin和end不是成员函数,而是要把数组名作为参数。
ptrdiff_t:带符号整型,表示两指针间距。
*p+4:先解引用再+4。
C风格字符串:strlen(p),strcmp(p1,p2),strcat(p1,p2),strcpy(p1,p2)。
可以用C风格字符串代替string类型,反之不行(但可以用s.c_str()返回C风格字符串)。
int (&row)[4]=ia[1]:把row绑定到ia的第二个4元素数组上。
范围for来循环多维数组,为了避免数组被转成指针,要用auto &。
若ia是一个二位数组,auto p=ia(p是指向二维数组的指针),则*p是指向一维数组的指针,**p是一个整型,当然使用begin(*p)更简洁一点。
Chap4:
当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值得似乎和,用的是对象的身份(在内存中的位置)。
decltype(左值)得到引用,decltype(右值)得到的与右值类型相同。
递增运算符和解引用运算符的优先级相同并且都比算术运算符的优先级高。
*++iter:即*(++iter),iter先自增,返回增加后的数值,再解引用。
整形除法如果含小数直接舍去(保留正负号)。
带符号数的除法法则:先考虑商,再用被除数(除数×商) 即得余数。
string在循环中要声明为引用,可以避免对元素的拷贝。
if(val==true):只有当val=1时才为真。
++i:首先将运算对象加1,然后将改变后的对象作为求值结果,后置版本也会将对象加1,但是求值结果是运算对象改变之前那个值的副本。
后置递增运算符的优先级高于解引用运算符。
解引用运算符优先级低于点运算符,所以执行解引用运算的子表达式两端必须加上括号。
条件运算符的优先级非常低,若使用条件表达式作为运算则要加上括号。
位运算的小整型要提升。
建议仅将运算符用于处理无符号类型。
移位运算符移出边界则舍去。
移位运算符的优先级低于算术运算符,高于关系运算符、赋值运算符和条件运算符。
sizeof运算符:sizeof *p= sizeof (*p)。
逗号运算符:从左向右运算,返回最后一个值。
算术转换:转换成最宽的。
整型提升:int、各种char、long,转换成式子里最宽的。
无符号和带符号的转换:依赖于机器 P142。
显式转换:int ival1=static_cast<int> ival2,其中ival2本身不是int;char *p=const_cast<char*> (pc), 其中pc原本带const,转换后p不是const,但p能不能再修改取决于指向的对象是不是const。