操作符详解

目录

一.操作符的分类
二.二进制和进制转换
三.原码,反码和补码
四.移位操作符
五.位操作符:& | ^ ~
六.单目操作符
七.逗号表达式
八.下标访问【】,函数调用()
九。结构成员访问操作符
十.操作符的属性:优先级,结合性
十一.表达式求值

2.二进制和进制转换

二进制,八进制,十进制,十六进制就是数值的不同表示形式而已。

比如,数值15不同进制的表示形式;
二进制:1 1 1 1
八进制: 1 7
十进制:1 5
十六进制:F

2.1二进制和十进制转换

其实十进制的每一位是有权重的,十进制的数字从右向左是个位,十位,百位。
在这里插入图片描述
二进制和十进制是相似的,那二进制中的1101如何理解呢?
在这里插入图片描述

2.1.1十进制转二进制

在这里插入图片描述
从下往上的余数就是转换后的二进制数字。

2.2二进制八进制和十六进制

2.2.1二进制转八进制

从右往左,二进制中的三位换八进制的一位(三换一)
例如二进制1111换为八进制1 7。

0开头的数字会被当做八进制数字

2.2.2二进制转十六进制

从右往左,二进制中的四位换十六进制中的一位(四换一)

0x开头的数字会被当作十六进制数字。

3.原码,反码和补码

整数的二进制表示方法有三种,即原码,反码和补码。

有符号整数的三种表示方法均有符号位数值位,二进制序列中,最高的一位是被当作符号位,剩余的都是数值位。

符号位都是用0表示正,用1表示负。

正整数的原码,反码和补码都相同
负数的三种表达方法各不相同。

在这里插入图片描述
补码变原码:取反加一

原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。

反码:将原码的符号位不变,其他位依次按位取反就是反码。(1变0,0变1)

补码:反码+1就是补码

举例:二进制数字1101
反码:1 010(按位取反)
补码:1 011(反码加一)

**对于整形来说:数据存放内存中其实存放的是补码。**如果使用原码会导致与负数的计算结果错误,如下图所示:
在这里插入图片描述

4.移位操作符

<<:左移操作符
>>:右移操作符
注意:1.移位操作符的操作数只能是整数。
2.移位操作符的操作对象实际是这个整数在内存中存储的二进制编码(即补码)

4.1左移操作符<<

移位规则:左边抛弃,右边补0
在这里插入图片描述
举例:
在这里插入图片描述
注意:对于负数不管是左移还是右移,在移动完成后需要取反加一转换成原码再转化成十进制

4.2右移操作符>>

移位规则:首先右移运算分两种

1.逻辑右移:左边用零填充,右边丢弃
2.算数右移:左边用原该值的符号位填充,右边丢弃。(如果原数为负数则补1,正数补0)

右移到底采用逻辑右移还是算数右移是取决于编译器,但通常采用的都是算术右移。
举例:
在这里插入图片描述

5.位操作符

位操作符:
1.&:按(二进制)位与
2.|:按(二进制)位或
3.^:按位异或
4.~:按位取反

注意:它们的操作数必须是整数。

5.1 & 按位与

规则:两1才1,有0则0;
在这里插入图片描述
n=n&(n-1) 作用:去掉二进制序列中的一个1

# 5.2 | 按位或

规则:有1则1,两0才0
在这里插入图片描述

5.3 ^ 按位异或

规则:相同为0,相异为1
不上图了,自己照着上面敲一个试试。

5.4 ~ 按位取反

按位取反:把数值在内存中的二进制数值按位取反,不包括符号位。

6.单目操作符

&—————取地址操作符
*—————解引用操作符
这两个后面指针会详细写

7.逗号表达式

逗号表达式:用逗号隔开的多个表达式

逗号表达式,从左到右依次执行,整个表达式的结果是最后一个表达式的结果。
在这里插入图片描述
逗号表达式一定要从左往右依次计算。

8.下标访问[],函数调用()

8.1[]下标引用操作符

操作数:一个数组名+一个索引值(下标)

int   main()
{
int fxk[10]={1,2,3,4,5};
int a=fxk[4];//数组中下标为4的元素。

return 0;
}

8.2()函数调用操作符

第一个操作数是函数名,剩余的操作数是传递给函数的参数。

int main()
{
printf("fxkszsd\n");//()就是函数调用操作符
//操作数:函数名  传给函数的内容
return 0;
}

9.结构成员访问操作符

9.1结构体

c语言已经提供了内置类型,如:int short long float等等,但是只有这些内置类型还是不够的,假如我想描述学生,则需要名字,身高,体重,学号,年龄等,

c语言为了解决这个问题,增加了结构体这种自定义的数据类型,让程序员可以自己创造适合的类型。

结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量,如:标量,数组,指针,甚至是其他结构体。

9.1.1结构的声明

struct-------结构体关键字
student ---------自己随便起名(描述的对象)
下图为定义一个学生的结构体

struct student
{
char name[20];
int age;
float score;
};


struct student a1={“章鱼哥”,18100};
 //学生1,这个就算是初始化了
struct student a2;//学生2
//可以将上段看作“图纸”,
//下段看作“根据图纸盖的房子”

如果想要将结构体的内容拿出来呢?比如找a1的年龄,只需要在变量名称后面加个.就可以选择了,例下图:
在这里插入图片描述

10.操作符的属性:优先级,结合性

c语言的操作符有2个重要的属性:优先级,结合性,这两个属性决定了表达式求值的计算顺序。

10.1优先级

相邻的操作符,优先级高的先执行

3+4*5

上面示例中既有加法运算符又有乘法运算符,但是乘法的优先级高于加法,所以先计算4*5,而不是3+4.
附图:遇到了查一下就行,别背
在这里插入图片描述

10.2结合性

如果两个运算符优先级相同,优先级就没办法确定先计算哪个了,这时候就看结合性了,就是根据运算符是左结合,还是右结合,确定执行顺序,大部分运算符是左结合(从左向右),少数运算符是右结合(从右向左),比如赋值运算符=。

11.表达式求值

11.1整形提升

c语言中整形算数运算总是至少以默认整形类型的精度来进行的。

为了获得这个精度,表达式中的字符短整型操作数在使用之前被转换为普通整型,这种转换被称为整型提升

那么如何进行整型提升呢?
1.有符号整数提升是按照变量的数据类型的符号位来提升的。(负补1,正补0)
2.无符号整数提升,高位补0。
例子:
在这里插入图片描述

11.2算术转换

整型提升:讨论的是表达式中char和short的值。
算数转换:讨论的是类型大于等于整形的类型的类型。

如果某个操作符的各个操作数属于不同的类型,那么除非某一个操作数转换为另一个操作数的类型,否则操作就无法进行,下面层次体系为寻常算数转换。
在这里插入图片描述
如果某个操作数的类型在上面这个列表中排名靠后,那么要首先转换为另一个操作数的类型后执行运算。

11.3总结

即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在潜在风险的,建议不要写出特别复杂的表达式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值