Re 从零开始的C++之路(一)变量

自从开始学习计算机以来,第一门接触的高级语言就是C语言。从此就爱上了类C的语言。直到学习了C++,便认为C++是世界上最好的语言23333。过去使用的一直都是C plus,根本没有真正系统仔细成体系的学习C++,再加上一直也没做过什么大型的项目。趁着还没入学的时间,就忘记过去,从零学习C++。我会每天或者不定时贴上一些C++学习的笔记心得。暂时是零散散碎的,希望能给路过的同学们一定的帮助。大致的路子就是重走C++Primer。这本书在我的书架里躺了2、3年了,一直以来也没有攻破过三分之一,这次我想完成一周目,欢迎各位交流监督,废话不多说 开始今天的Re C++ !!  

 1.C++中的变量初始化
int i = 0;//复制初始化
int i = {0};//列表初始化 不会存在丢失部分数据的问题 比如用long 去初始化int 用float去初始化int
int i(0);//直接初始化
int i{0};//直接列表初始化 不能超过int值表示的范围 必须是常量


2.默认初始化
定义在main外int初始化为0
main内部是随机的 在函数里是不被初始化的(直接使用会发生错误) 
将变量定义的时候初始化是一种非常好的习惯。
很多报错的问题都是访问越界或者引用了一个未被初始化的未知的值而引起的。


3.声明和定义的区别
定义是给变量指定了名字和类型,分配存储空间,并且给变量指定初始值
为了允许把程序拆分成多个逻辑部分来编写,C++支持分离式编译,将程序分成多个文件,每个文件单独编译。
为了让一个文件使用别的地方定义的变量就必须声明。
声明只给变量指名字和类型,声明使名字对程序可见
为了声明不定义,使用extern 
比如: extern int i;
如果在一个函数体内部,如果试图初始化一个由extern关键字标记的变量,将会出现错误。
4.内置类型
算数类型 + 空类型  ==  内置类型
字符 + 整数 + 布尔 + 浮点数 = 算数类型
算数类型:
bool 布尔类型 尺寸未定义
char 字符 8位
wchar_t 宽字符 16位
char16_t Unicode字符 16位
char32_t Unicode字符 32位
short 短整型 16位
int 整型 16位
long 长整型 32位
long long 长整型 64位
float 单精度浮点数 6位有效数字
double 双精度浮点数 10位有效数字
long double 扩展精度浮点数 10位有效数字
char的大小就是可以存放机器基本字符集中任意字符对应的数字值 所以一个char应该和一个机器字节一样大
类型wchar_t、char16_t、char32_t应该确保可以放下最大扩展字符集对应的数字值 尤其是中文对应的大小一般char是无法满足的


5.字节(byte)、字(word)
可被寻址的最小内存单位成为字节,一般都是8比特。存储的基本单元称为字。


6.float 和double
执行浮点计算的时候一般可以选用double
因为float常常计算精度不够高,而且double 和float的计算代价差不多,在有的机器中,double甚至比float还要快。


8.得知机器本身算数类型的占用空间和计算精度的方法
可以使用 sizeof()函数 也可以使用提供的宏得知

CHAR_BIT char占用空间 
SCHAR_MIN signed char的最小值
SCHAR_MAX signed char的最大值
UCHAR_MAX unsigned char的最大值
CHAR_MIN char的最小值
CHAR_MAX char的最大值
MB_LEN_MAX 一个多字节字符的字符最大数
SHRT_MIN 短整型的最小值
SHRT_MAX 短整型的最大值
USHRT_MAX 无符号短整型的最大值
INT_MIN 整形的最小值
INT_MAX 整形的最大值
UINT_MAX 无符号整数的最大值
LONG_MIN 长整型的最小值
LONG_MAX 长整型的最大值
ULONG_MAX 无符号长整型的最大值
LLONG_MIN long long 的最小值
LLONG_MAX long long 的最大值
ULLONG_MAX 无符号long long 的最大值


9.自动类型转化
对象的类型决定了对象包含的数据以及能参与的运算。类型转换就是改变对象的类型。
首先是自动的类型转换,当我们使用一种类型而其实对象需要的是另外的类型的时候程序会自动进行转换。
这里无需多言,比如
bool a = 35;
float b = 3.14;
float c = a + b;
则c == 4.14.
这里就将bool类型转换为了float进行计算。由于是机器自动的,所以我们应该尽量避免无法预知的的和依赖环境的行为。
做到尽在自己掌握之中,尤其是在计算精度要求高,或者步骤繁琐复杂的项目中。可谓失之毫厘谬以千里。


在有符号数和无符号数参与的时候尤其要注意。例如
unsigned int a = 32;
int b = -27;
然后我们计算一下 a + b == 4294967287 
因为要将 int b 转换成为 unsigned 负数转换为无符号数相当于这个负数加上无符号数的模
显然这不是我们想要的结果


如果执行 for(unsigned i = 8;i <= 0;i--) 
由于 i变成-1时会自动进行转化 成为-1+无符号的模变成一个正数,这个循环永远也停不下。在循环中一定慎用无符号数。


10.字面值常量 
例如18这样的值被称为是字面值常量,显然这样一看就知道。
可以将整型变量改变成为十进制、八进制、十六进制
20 是 20 ,024是八进制 0x14是十六进制 
字符和字符串常量是用字符串数组存储的 用''或者""表示 如"Tuzi"
如果两个字符型字面值常量紧邻或者仅仅由有限个空格或者换行 则应该看做是同一串字符串 如
cout<<“12345”
“67890”<等价于 cout<<"1234567890"<这种情况可以应用于一行太长分多行书写。


转移序列 应用在不可打印的字符上 常用的有:
\n换行符 \t横向制表符 \r回车符 \?问好 \"双引号 \'单引号
指定字面值的类型就跳过了 感觉没什么实际的作用 等以后遇到了再说


11.变量定义 
变量定义的基本形式 是 类型说明符 + 变量名 
初始化 令对象在创建时获得一个特定的值,即为对象的初始化。
double price = 100.2;//先定义 后初始化 用=初始化
但是初始化和赋值是完全不同的两个操作。初始化不是赋值,初始化的含义是创建变量的时候赋予一个初始值,而赋值的含义是把对象的当前值擦除,以一个新值代替.(我也不清楚为什么书里特意强调这点,以后遇到再说)


12.静态类型
C++是一门静态类型语言,在编译的时候检查类型。编译器负责检查数据的类型是不是满足运算的要求,如果试图执行不满足条件的运算将会报错。


13.标识符
标识符可以使用字母数字下划线。不能用数字开头。但是起名字是门学问 不能一直 a b c
下面有几种命名的规范 英语不好的同学一定要努力学习英语 都是眼泪5555


标识符要能体现出实际含义
变量名一般用小写字母 
用户自定义的类名一般用大写字母开头
如果标识符由多个单词组成,则单词应该有明显的区分。另外不要和关键字重复


14.复合类型


引用(reference)是指给对象起了另外一个名字。通过&name 来实现引用。
int ival = 1024;
int &refVal = ival;//必须是对象 字面值不行
int &refVall2;//引用必须初始化


一般在初始化变量时,初始值会被拷贝进新对象里。定义引用的时候,仅仅是将引用和初始值绑定在一起,不是复制。一旦初始化完成,引用将和他的初始值一直在一起。引用没有办法重新绑定到另外的对象身上,所以必须初始化。(连体婴儿2333)
引用不是对象,而是已经存在的对象的别名。由于引用不是对象,所以不存在引用的引用。


指针(pointer)是指向另外一种类型的复合类型。指针也可以实现对一个对象的间接访问。与引用不同的是
指针本身是一个对象,可以赋值和修改。所以指针也不是必须被初始化。然而还是提倡初始化,滥用未知的指针对于Debug来说绝对是一场噩梦。
指针使用*name的形式使用。
int *ip;//ip是指向int型变量的指针
double p1,*p2;//p1是double型变量 而p2是指向double型变量的指针。


获取对象的地址使用&(取地址符)
int val = 42;
int *p = &val;
指针的值一定是4种状态中的一种。
指向一个对象
指向对象紧邻的所占空间的下一个位置
空指针,谁也没指
无效指针
试图访问和拷贝无效的的指针都会发生错误。这种错误编译器是查不出来的。尤其小心。
用解引用符(*)来访问指针所指的对象
int v = 42;
int *p = &v;
cout << *p;


空指针不指向任何一个对象,使用的时候要注意。用nullptr关键字。
过去还会使用NULL的预处理量,她在中定义 值为0
可以使用if(p)这样的句子 要是指针p为空 则if不成立
void*指针是一种特殊的指针。它可以存放任何一种指针的数据。但是并不知道它具体是什么类型。
可以看做仅仅是一段内存中的地址。


今天就写这么多 主要是针对C++的变量的一些基础知识。 
第一次写 就是记录下来的笔记 以后慢慢改进 多谢各位捧场。  


你可能感兴趣的:(C++)