wchar_t,char16_t,char32_t用于拓展字符集
char和signed char并不一样,由编译器决定类型char表现上述两种中的哪一种
一般long的大小和int无二,如果超过int的范围直接使用long long类型
float比较鸡肋,精度和速度都不如double(在某些机器上),所以小数索性都用double
若值超过无符号类型最大值,则获得的实际值=value%MaxValueOfType;若值超过有符号类型最大值,结果无法预知
算数表达式中若存在无符号类型,则其他运算数自动转化为无符号型,造成错误,而且结果也不可能小于0
以0开头表示八进制数,以0x或0X开头表示十六进制数
字符串等价于字符数组(末尾带有编译器赋予的'\0'),多行表示格式:
std::cout<<"a really, really long string literal "
"that spans two lines."<<std::endl;
转义字符:
换行符:\n 横向制表符:\t 响铃符:\a 纵向制表符:\v 退格符:\b 双引号:\" 反斜线:\\ 问号:\? 回车符:\r 进纸符:\f
字面值常量的前缀和后缀:
前缀:u 指定类型 char16_t
U 指定类型 char32_t
L 指定类型 wchar_t
u8 指定类型 char(此前缀仅可用于字符串字面值常量,表示UTF-8)
后缀: u或U 指定类型 unsigned及更大
l或L 指定类型 long及更大
ll或LL 指定类型 long long及更大
f或F 指定类型 float(浮点数字面值)
l或L 指定类型 long double(浮点数字面值)
初始化的形式也可以是:int i={0};(c++11) int i (0); int i {0};(c++11)
其中的花括号初始化法可以确保不存在数据因转化类型造成的丢失(一旦有丢失的风险就会报错)
基本类型的值如果在函数体之外未被初始化,其值为0;
基本类型的值如果在函数体之内未被初始化,其值不可知,任意对此值的访问将引发错误
仅想声明一个变量而不定义它,使用关键字extern: extern int i;(不定义意味着不申请存储空间且不赋予初始值)
此类名字不可用:fuck__drug,_Grug,_drug(函数体外)
允许内层作用域中重新定义外层作用域的名字,反之不可
引用:(通常指左值引用,c++11引入了右值引用的概念)
例如:int ival=1024;
int &refVal=ival;(refVal指向ival,认为refVal是ival的一个别名,而且不能再转而指向其他元素,即绑定在一起:你就是我,我就是你)
若如:int &refVal2;则发生错误,引用声明后必立即初始化,即指向一个对象(字面值不可)
指针:(本身即是对象)
例如:int *ip1,*ip2;(这里类型是int*,即int型指针,ip1和ip2仅是名字)
int *p=&ival;(获取ival的地址赋予p,p存放ival的地址)
int *p1=ival;(p指向int型对象ival)
int ivalValue=*p(使用解引用符*能访问对象)
*p=100;(此举使得ival的值为100, 指针指向了对象,也就获得了对对象的操作权)
int *p3=nullptr;(c++11)(等效于int *p3=0;等效于int *p3=NULL;p3为空指针,不指向任何对象)