C++ 关键字(static const extern inline...)的理解

一.基本数据类型()
auto:
声明变量时根据初始化表达式自动推断该变量的类型
auto a = 1; //a为int类型的变量
auto关键字更适用于类型冗长复杂、变量使用范围专一时,使程序更清晰易读 例:
std::vector<int> vect;
for (auto it = vect.begin(); it != vect.end(); ++it)
{
//it的类型是std::vector<int>::iterator
std::cin >> *it;
}
详细参考:https://blog.csdn.net/xiaoquantouer/article/details/51647865·
decltype:
声明变量时根据初始化表达式自动推断该变量的类型。
与auto关键字类似。auto定义变量时,必须初始化,编译器才能根据初始值判断变量类型。decltype可以根据返回值自动确定变量类型。用法:
decltype(Func) value; //变量value的类型由函数Func的返回值确定。此处Func的返回值类型不能为void。
bool:
占用内存:1byte (验证:vs2017 )为true时 在内存中的表示 0000 0001 ;为false时 0000 0000
有两个值:true或false。同时0表示false,其它数字都表示true
Q: 为什么不用一个bit来保存bool类型的变量?
A: 电脑对内存最小的寻址单位为byte,所以如果要做成1bit的话读出时需要再进行一次与运算和移位操作,写入需要增加移位操作和或运算,效率会下降一些。
char:
占用内存:1byte
可以表示256(2^8)个字符: 包括128个Ascii字符和128个Ascii扩展字符。(unsigned char 表示128个Ascii)
整形变量 int, short, long:
64位机器 占用内存: int 4byte, short 2byte, long 4byte
int和long都是占用4个字节,要long有什么意义?
C语言开始时只有char(8位)和int(16位)两种,后来随着发展又加入了short(16位)和long(32位),此时,int可以是16位或者32位,依赖于平台和后续的兼容性。再后来当64位出现时,long long(64位)又被添加进来,为了进行规范,对较小的一些类型的范围就有了一些调整,逐渐稳定为int32位,long可以有多种定义,可以是32位,也可以是64位。
C++标准上只是说long至少要和int一样大,所有整数类型实现时要满足如下规范:
sizeof(char) == 1
sizeof(char) <= sizeof(short)
sizeof(short) <= sizeof(int)
sizeof(int) <= sizeof(long)
sizeof(long) <= sizeof(long long)
除了char和long long,其余的类型范围较灵活,都是平台相关的,与实现相关。如果要实现平台独立的话,在windows平台上,就有__intn可以使用,n代表位数。__int8 __int16 __int32 __int64。
如果要使用的数字超过了long的范围,可以使用long long变量声明。
浮点数 float, double:
32位和64位机器:float 4byte,double 8byte,long double 至少8byte
通常使用 E 符号来表示浮点值。以 E 符号表示,数字 47 281.97 就应该是 4.728 197E4。E 前的数字部分是尾数,E 之后的部分是 10 的幂。
| 十进制法 | 科学计数法 | E 符号表示法 |
|---|---|---|
| 247.91 | 2.4791 X102 | 2.4791E2 |
| 0.00072 | 7.2 X10-4 | 7.2E-4 |
| 2 900 000 | 2.9 X106 | 2.9E6 |
在 PC 上的浮点数据类型的大小和范围
| 数据类型 | 关键字 | 大小 | 范 围 | 有效数字 |
|---|---|---|---|---|
| 单精度 | float | 4字节 | 数字介于 ±3.4E-38 和 ±3.4E38 之间 | 7 |
| 双精度 | double | 8字节 | 数字介于 ±1.7E-308 和 ±1.7E308 之间 | 16 |
| 高双精度 | long double | 8字节 | 数字介于 ±1.7E-308 和 ±1.7E308 之间 | 16 |
浮点类型转为整型变量会直接舍弃小数点后的值 :
double dVal = 1.234;
int iVal = dVal; // iVal = 1
二.类型修饰关键字()
asm:
验证环境Visual Studio 2017 x86:
int a(1), b(2);
int* c = &a;
__asm
{
mov eax, c;
mov eax, [eax];
mov ebx, b;
lea eax, [eax + ebx];
mov a, eax;
}
:a = 3 (只实验了最简单的一些嵌入汇编)
break:
用来跳出循环或switch。只会跳出当前一层循环
switch 和 case:
switch和case需要搭配使用
throw, try, catch:(有点复杂。。。)
在C++标准中,只规定catch(…)必须能捕获程序中所有通过throw语句抛出的异常
参考:https://blog.csdn.net/windhaunting/article/details/4735338?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
https://www.itranslater.com/qa/details/2583825627723858944
throw, try, catch:(有点复杂。。。)
后续慢慢添加。。。
参考:
https://www.cnblogs.com/fanzhidongyzby/archive/2012/11/07/2759326.html
https://zhuanlan.zhihu.com/p/37908790
http://c.biancheng.net/view/1321.html
浙公网安备 33010602011771号