- long和int一般有一样的尺寸,如果你的数字式超过了int的表示范围,选用long long
- 注意char在不同编译器类型了可能不同,有时有符号,有时候默认无符号
- 执行浮点数最好用double.事实上,对于某些机器来说,双精度运算甚至比单精度快。
- long double提供的精度在一般情况下是没有必要的,况且他的运行时耗也不容忽视
- bool:非零即真()
bool ->(赋给)非bool(结果:false ->0;true->1)
非bool->(赋给)bool(结果:0->false;非零即真->true)
整数 -> 浮点类型 (结果:只保留小数点前的部分)
浮点类型 -> 整数 (结果:小数部分记为0,若该整数空间超过浮点类型,则精度有损)
赋给-> 无符号类型一个超出其表示范围时 (结果:是初始值对无符号类型表示在、数值总数取模后的余数)
例如:可以编译器自己测试一下:
1.当一个算数表达式中既有无符号又有int型时,那个int值就会转换为无符号数
注意:切记混用无符号和有符号类型
2.注意:当从一个无符号数中减去一个值时,不管这个值是不是无符号数,我们都必须确保结果不能是一个负值
例如如下: 就陷入了一个死循环!!!!可以用while来代替避免这种结果(要很清楚这两者的执行过程)
for(unsigned i = 10;i>=0;--i)
cout<<i<<endl;
初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是吧对象的当前的值擦除,而已一个新值来代替。
- 字面值常量:一眼能看见的值
- 注意 "A" 和 'A' 是不同的
- 对象:一块能存储数据并具有某种类型的内存空间
- 初始化 和 赋值 的区别?
初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来代替
- 列表初始化 默认初始化?
内置类型初始化 :如果使用列表初始化且初始值存在丢失信息的风险,则编译器报错
- 什么是内置类型?
如果内置类型的变量未被显示初始化,它的值由定义的位置决定。定义于任何函数体之外的变量被初始化为0;
定义在函数体内部的内置类型的量将不被初始化。未定义的,如果试图拷贝或以其他形式访问此类型值将引发错误。
2.变量声明和定义的关系
声明使得名字为程序所知;
定义负责创建与名字关联的实体;定义还申请存储空间,也可能会为变量付一个初值
如果想声明一个变量而非定义它,就在变量名前加extern ;
任何包含了显示初始化的声明即成为定义,给由extern关键字标记的变量附一个初始值,但这也抵消了extern的作用
变量能且只能被定义一次,但是可以被多次声明
3.c++是一种静态类型语言。其含义是在编译阶段检查类型
4.标识符
1.用户自定义的标识符中不能连续出现两个下划线;也不能以下划线连着大写字母;此外,定义在函数体外的标识符不能以下划线开头;标识符长度没有限制;
2.变量命名规范:体现实际含义;一般用小写字母;类名大写字母开头;多个单词组成用下划线连接
5.名字的作用域
1.同一个名字在不同的作用域可能指向不同的实体。名字的有效区域始于名字的声明语句
2.第一次使用时再定义它
3,作用域能彼此包含;允许在内层作用域中重新定义外层作用域已有的名字
如果函数有可能用到全局变量,则不宜再定义一个同名的局部变量
6.复合类型
7.引用
1.一般是指左值引用,引用必须被初始化,引用类型的初始值必须是一个对象(引用只能绑定到对象上,不能与字面值)
2.程序吧引用和他的初始值绑定在一起,而不是将初始值拷贝给引用
3.引用即别名 :引用并非对象,相反,他只是为一个已经存在的对象所起的另外一个名字
4.定义了一个引用后,对其进行的所有操作都是在与之绑定的对象上进行的
8.指针:
指针本身就是一个对象;无需在定义时赋初值;在快作用域内定义的指针如果没有初始化,也将可能是不确定的值
指针存放的是对象的地址
不能定义指向引用的指针:因为引用不是对象,没有实际地址
指针四种状态:
试图拷贝或以其他方式访问无效指针的值都将引发错误
利用指针访问对象,修改*p的值就是修改p所指对象的值
空指针:可以直接给指针字面值为0来赋为空,也可直接赋为NULL,其实NULL的值就是为0,但不能直接给指针赋一个变量, 哪怕是整型且值为0也不可
9.void*指针
1.可以存放任意对象的地址
2.不能直接操作void*指针所指的对象
3.以void*的视角来看内存空间也就仅仅是内存空间,没办法访问内存空间中所存在的对象
10.理解复合类型的声明
易错点:int* p1,p2;//这会造成一种错觉,好像这条语句中所有变量都是int*,其实int*仅仅修饰了p1,所有变量公用的只是int而已
指向指针的指针:二级指针
重要:引用本身不是一个对象,因此不能定义指向引用的指针;但指针是对象,所以存在对指针的引用
int I = 42;
int *p;
int *&r = p;//*说明r引用的是一个指针
r = &I;
*r = 0;
11.const限定符
1.const对象一旦创建后其值就不能再改变,所以const对象必须初始化
2,const主要的限制就是只能在const类型的对象上执行不改变其内容的操作
3.
4.
12.指针 和const
1.指向常量的指针:同常量的引用类似:不能用于改变其所指对象的值 ;
int i= 5;
int const * p = &i;
1.要想存放常量对象的地址,只能使用指向常量的指针:
2.指针的类型必须与其所指对象的类型一致,但有例外:允许零一个指向常量的指针指向一个非常量指针
(所谓指向常量的指针仅仅要求不能通过该指针改变对象的值,但没有规定哪个对象的值不能通过其他路径改变(这点同 常量的引用是一样的 ))
2.const指针:
常量指针:必须初始化,存放在指针中的地址就不能改变
例如:int i = 0;
int * const p = &i; //p将一直指向i
指针本身是一个常量并不意味着不能通过指针修改其所指对象的值 ,取决于所指对象的类型
3.顶层const:
顶层const:表示指针本身是个常量,本身不可以被改变
底层const: 表示指针所指的对象是一个常量(用于声明引用的const都是底层const)
执行对象的拷贝操作时,常量是顶层还是底层区别明显!!!
其中,顶层const不受什么影响
13.constexpr和常量表达式
- 如果我们把int的尺寸看做成是一个确定不变的已知值,那么这样的程序就称作是不可移植的
- 混合运算中的类型转换问题:
-