文章目录
1.unsigned int + int 结果为unsigned
//转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。
unsigned int u = 10;
int i = -42;
cout << i + u << endl; //4294967264(32的补码转化为原码.1....1110,0000)
2.unsigned int用循环需要注意
//死循环,等于0再执行一次,变成-1,补码为最大值
for(unsigned int u = 10;u >= 0;--u)
cout << u << endl;
3.字面值|wchar_t 宽字符
char 8位;
wchar_t 16或32位;
//字面值
L'a'; //wchar_t类型
//整数数字
u|U unsigned;
l|L long;
ll|LL long long;
//小数(加整数后报错)
f|F float;
l|L long double(小数);
4.初始化 != 赋值
初始化时创建变量时赋予一个初始值,赋值是把当前的对象擦除,用一个新值代替;
5.初始化列表(更加安全)
double ld = 3.1415926536;
int a{ ld }; //报错,可能会丢失信息 从“double”转换到“int”需要收缩转换
int b( ld ); //正确,丢失信息
int c = ld; //正确,丢失信息
//初始化,如果没有就会赋默认值
//定义在函数之外,默认值为0.
//函数体内部变量不会赋默认值,如果拷贝或访问就报错.
//默认值可以自己指定,如string,在函数内外无初始化默认值均为空串
//非法赋值
cin >> int a; //非法,>>运算符后不能定义;
int a=b=1; //非法,同一语句的初始化应该分别进行;
6.引用
//为变量值起别名,且创建时必须初始化
//引用赋值必须是对象(不能是常数)
//引用与变量的类型必须一致 (int a = 3;double &b = a;x)
7.指针
int *p1,p2; //p1是int型指针,p2是int型变量
//指向指针的引用,没有指向引用的指针
int a = 1;
int *p = &a;
int *&r = p; //r是指针p的一个引用
//从右往左看,是引用之后才是指针.所以是一个指向指针的引用
8.const
//默认作用域是同一个文件下
//如果要多文件就需要加 extern
double dval = 3.14;
const int &ri = dval;(可行)
/*过程,其实指向的是临时变量
const int temp = dval;
const int &ri = temp;
*/
//从右往左看
int a = 10;
const int *ptr = &a; //其实是指向的地址无法改变,值可以通过a改变
cout << *ptr; //10
a = 12;
cout << *ptr; //12
*ptr = 13; //错误
//指向常量的指针可以不初始化
const int *p; //可以
9.constexpr 常量表达式
//一定是const修饰,且具体值不用运行就得到的.
//直接等于常量或者常量相运算,getSize()这种不行,除非getSize()声明为const
//*1、尽管指针和引用都能被定义成constexpr,但它们的初始值却受到严格限制。一个constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象。
//2、函数体内定义的变量一般来说并非存在固定地址中(除了static等修饰,且const也不行,static之前不能加限定词volatile,否则出错),相反,定义于所有函数体之外的对象其地址固定不变,能用来初始化constexpr指针,同时能用constexpr引用绑定到这样的变量上。
//3、对于指针而言,constexpr仅对指针有效,与指针所指的对象无关。
const int *p = nullptr; //正确,p是一个指向整型常量的指针
constexpr int *q = nullptr; //正确,但q是一个指向整数的常量指针
2.
constexpr int i = 42;//(必须在函数外或者加static才能确定地址)
constexpr const int *p = &i;
10.类型别名(typedef)
//typedef 类型名 自定义名称;
typedef pair<int, int> pii;
//using 自定义名称 = 类型名;
using pll = pair<long, long>;
11.类型指示符
//decltype(变量) 变量名 = 值;
int i = 42;
decltype(i) j = 41; //int j = 42;
decltype((i)) k = &a; //int &k = a;