第二天
一、上次提到类型转换
unsigned int 和 long进行运算时,会转化成 unsigned long
double转float:如果原值超过目标范围,则结果为NaN(正无穷或负无穷)
float转int:丢弃小数部分,如果原值整数部分超过目标范围则结果错误
大整数转小整数int转short:截断高位字节,保留低位字节,若原值超过范围则结果错误
相同字节的整数:unsigned int 转 int 或 int 转 unsigned int,保持原码不变,结果可能改变符号
有符号整数转大整数:符号位会进行扩展,低位字节不变。
无符号小整数转大整数:高位字节用0填充,低位字节不变,能保持符号和值。
强制类型转换:显式类型转换,用类型转换符指明转换的一种操作
比如:y=(double)a/b,a和b均为整数
计算过程是:先将a转化为double型,又因为除法的两个操作数类型要一致,所以将b也转化为double型,然后再进行计算。
但是如果是:y=double(a/b)则是先将a和b进行整数的除法运算得到一个整数,再将这个整数转为double类型,区别很大,可以自己列一个去试试。
这边强调一个左值和右值问题:
左值一般指变量,能存放数据的空间。
右值就是能放在赋值号右边的表达式。
左值加上前置自增或自减还是左值。
但是左值加上后置自增或自减就是右值。
右值一般是不能给它们赋值的。左值可以作为右值。
整数/double型所得到的值是整数型。 就是看/左边是什么,就要把/右边的值转化为什么类型。
a-=a+=a*a; 假设一开始a=5;则a最终的值为0;
要记住int 和 unsigned是会往 unsigned转化的。
a?b:c;这种符号表达式是会先将b和c往哪一边精度高的先转化,然后再进行赋值。
像这种---x+y,负号不能一堆连在一起,但是在中间岔开就可以。
二、基本语句
- if
- else if
- else
这里的else相当于在if的基础上进行嵌套,当if为false时,执行else if。
这里也没啥东西,都是非常基础的东西啦。
三、函数预处理
函数名称和形参(包括个数和类型)作为函数的基调。
静态全局变量只能在本文件内使用。
非静态全局变量可以在其他文件使用。我们通常说的全局变量是指非静态全局变量。
static可以修饰函数,使它只能在本文件内使用。
宏定义的默认值是1
四、数组
decltype(a1) b1 以a1类型来定义b1;
下标越界访问是不会有错误提示的,只是访问相邻的内存单元,如果仅仅读取元素,结果无法估计;如果改变元素,可能导致严重错误。
for(auto e:a) 这里的e只是a中元素的一个拷贝,如果改变e是不会影响到a中的元素的。
但是for(auto &e:a)这是的e是a的一个引用,改变e是会改变a中的元素的。
但是这种循环方式是不能用于函数形参的,因为for的范围是没办法确定的。
数组可作为函数的形参,一个函数不能返回一个数组,因此往往返回一个指针来指向一个数组。
数组作为形参,如果有const修饰,则函数体中不能改变实参数组的元素。
数组实参传递给形参,但是没有包含实参数组的长度,往往需要增加一个形参来表示数组的长度。
五、字符串和字符数组
这里姑且将数组和字符方面的东西分开。
字符数组就是有字符型元素组成的数组,而字符串则是由0值结尾的字符数组。
如果混有中英文的话,就会采用gbk编码。中文占两个字节。
浙公网安备 33010602011771号