数组:
1.数组是一组相同元素的集合;
2.变长数组不能初始化,数组初始化可以不完全初始化,未初始化部分默认为0;
3.一维数组在内存中是连续存放的,数组名是数组首元素的地址,但有两个例外:sizeof(数组名)里面的数组名不是数组首元素地址,数组名表示整个数组,&数组名,这里的数组名表示整个数组,取出的是整个数组的地址;
4.数组越界.一维数组下标<0,下标>n-1都是数组越界,二维数组类似;
5.冒泡排序:数组中两个相邻元素进行比较,如果不满足顺序就交换;
操作符:
<< : 左移操作符:补码左移一位(往左边推一位,右边补0);
>> :右移操作符:补码右移一位(往右边推一位左边补0或1,也许会补1,要看编译器选哪个,右移操作符分为 算术右移(右边丢弃,左边补原符号位) 和 逻辑右移(右边丢弃,左边补0));
& : 按位与(二进制(的补码)与,同不变,否则0);
| : 按位或(二进制(的补码)或,有一个1都是1);
^ : 异或 (二进制(的补码)异或,相同为0,相异为1);// 这三个 &,|,^ 都是在补码上操作
符号位:符号位写0表示正数,写1表示负数;
整数在内存中存的是二进制的补码形式,整数的原码,补码,反码如下:
正(整)数的原码,补码,反码都是一样的,负(整)数的原码就是将十进制转二进制,反码为原码的符号位不变,其他位按位取反,补码就是在反码的基础上加1;
复合赋值符,以 += 为例,a+=2表示 a先加上2然后再把a+2赋值给a,与=复合的还有 - * / %等等,都是类似的表示意思。
! :真变假,假变真,如,!a 若 a 为真,则!a为假;
& :表示取地址,如 &a 表示取 a 的地址;
sizeof :求操作数的类型长度(以字节为单位);
* :解引用操作符,如,int* p 中的*表示p是指针,*p中的*是解引用操作符;
!= :表示不相等;
&& :表示逻辑与;
|| :表示逻辑或;
exp1?exp2:exp3 表示若exp1为真,则执行exp2,再把exp2的结果作为最终结果,若exp1为假,则执行exp3,再把exp3的结果为最终结果;
exp1,exp2,exp3,...,expN 表示从左到右依次执行,把最右边的结果(expN )当作最后结果;
[ ] :表示下标引用操作符,如数组 arr[10] 中的[ ]就出自于此arr,10都叫操作数,arr[10]还可以写成10[arr];
( ) : 表示函数调用操作符,接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
访问一个结构体的成员时可以用 . 也可以用 ->
. 结构体.成员名
-> 结构体指针->成员名
表达式求值:表达式求值的顺序一部分是由操作符的优先级和结合性决定。同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。
注:1.sizeof()括号中的表达式不参与计算;
2.多个 与,如:a && b && c中,从左到右有一个为假后面的都不再计算;
3.对于多个 或,从左到右,左边有一个为真后面都不在计算;
隐式类型转换
C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度
一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长
度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令
中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转
换为int或unsigned int,然后才能送入CPU去执行运算。
如何进行整体提升呢?
整形提升是按照变量的数据类型的符号位来提升的,负数的整形提升,高位补充符号位,即为1,正数的整形提升,高位补充符号位,即为0,无符号整形提升,高位补0,高位补不一定是补一个,有可能要补一堆0或1,如
//负数的整形提升
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
算术转换:如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。
long double
double
float
unsigned long int
long int
unsigned int
int //这些类型转换是由下向上转换的
上表的类型转换是由下向上转换的,由 隐式类型转换 和 算术转换 知道,<=int 用的是整型提升,提升到int;>=int用的是算术转换,转换到的是比int大的,也就是上表的转换规则。