C.7:数组与操作符

数组:

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大的,也就是上表的转换规则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值