char类型是无符号还是有符号由编译器决定,所以应该明确指定类型为 signed char 或 unsigned char
float和double计算代价相差无几,有些时候double比float还快,所以应该优先使用double
表达式中既有带符号类型又有无符号类型时,带符号类型会自动转换成无符号类型,有可能出现不期望值,一定要注意,无符号类型很危险
统一列表初始化
int units_sold{0};
声明变量
extern int i; 如果给i赋初始值,则抵消extern,语句变成定义
变量定义规则:
int i = 1024; *p = &i; &r = i;
//同时定义int变量,指针,引用
int i = 42;
int *p;
int *&r = p;//引用指针,r为p的别名,可互等.阅读从距离变量最近的位置开始读含义,即r首先是个引用,引用的为指针
Const 变量本质上还是一个变量,Const是通知编译器此变量不可更改,可强行转换告诉编译器可更改其值,如果实际中没有更改其值,编译器为了优化会硬编码值替换对应变量.
Const 对象默认被设定为仅在文件内有效,即多个文件中出现了同名的const变量,等同于在不同文件中分别定义了独立的变量,解决办法是不管声明还是定义都添加extern
extern const int bufsize = fcn();//定义
.h
extern const int bufsize;//声明
const引用可绑定到 一个能转换成对应引用的表达式,本质上是绑定到了一个临时变量上
double dv = 10.5;
const int &r1 = 10;
const int &r2 = dv;
// int Temp = dv;
// int &r2 = Temp
//即修改引用不会改变本来的值,因为绑定在临时变量上
const double *cptr = π//指向常量的指针
double * const pip = π//常量指针
constexpr 常量表达式类型, 验证值不会改变并且在编译过程就能得到计算结果.
类型别名
typedef double wages;
using SI = Some_Class;
auto 根据赋初值自动推算变量类型,如果多个变量在一条语句中,则基本类型相同.
decltype 编译器分析表达式并得到它的类型,由于是在编译器时期,所以不会计算表达式的值
引用从来都作为其所指对象的同义词出现,只有用在decltype处是一个例外
decltype如果操作一个变量,则类型为变量的类型,如果是一个表达式,表达式是左值,则结果为值类型引用,如果为右值,则结果为对应值得类型.
预处理,程序员应该习惯加上头文件保护,没必要在乎你的程序到底需要与否
头文件一般不应该使用using 声明