C语言中的操作符

一、操作符的分类

算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成

二、算数操作符

在这里插入图片描述

  1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
  2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
    在这里插入图片描述
  1. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
    在这里插入图片描述

三、移位操作符

在这里插入图片描述

移位操作符移的是计算机中的二进制数
知道移的是二进制数,那就要知道,计算机存的中存储数据是是数据的补码计算机中的原码、反码、补码

1.对于正整数来说:
原码 = 反码 = 补码
2.对于负数来说:
原码
反码 = 原码符号位不变,其余各位取反
补码 = 反码 + 1

3.1、左移操作符<<

计算机在内存中存储的是补码
对于正整数来说:
在这里插入图片描述
对于负整数来说:
在这里插入图片描述

3.2、右移操作符>>

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

  1. 逻辑移位 左边用0填充,右边丢弃
  2. 算术移位 左边用原该值的符号位填充,右边丢弃
    在这里插入图片描述

四、位操作符

& 按位与 1&1=1, 1&0=0, 0&0=0
| 按位或 1|1=1, 1|0=1, 0&0=0
^ 按位异或 相同为0,相异为1
在这里插入图片描述

4.1、一道变态的面试题:不能创建临时变量(第三个变量),实现两个数的交换

这里是引用

五、 赋值操作符

int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值
连续赋值
a = x = y+1;//连续赋值
这样的代码感觉怎么样?
那同样的语义,你看看:
x = y+1;
a = x;
这样的写法是不是更加清晰爽朗而且易于调试。

复合赋值符
+= -= *= /= %= >>= <<= &= |= ^=
在这里插入图片描述

六、单目操作符

6.1 单目操作符介绍

在这里插入图片描述

6.2、sizeof

sizeof不是函数,而是操作符
sizeof计算的是变量和数据类型创建变量的大小(所占内存的大小,单位字节),和内存中存放什么没有关系。
在这里插入图片描述
在这里插入图片描述
sizeof内部的表达式是不参与计算的
在这里插入图片描述

6.3、~按位取反

把一个数的二进制数列的每一位按位取反,包括符号位
在这里插入图片描述

七、关系操作符

这里是引用
这些关系运算符比较简单,没什么可讲的,但是我们要注意一些运算符使用时候的陷阱。
有些是不能比较的,比如说人和狗就不能比较
警告:
在编程的过程中== 和=不小心写错,导致的错误

八、逻辑操作符

这里是引用
在这里插入图片描述

8.1、360笔试题

int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	
	printf(" a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);
	return 0;
}

运行的结果是什么???
在这里插入图片描述

九、条件操作符(三目操作符)

这里是引用

十、逗号表达式

在这里插入图片描述

十一、下标引用、函数调用和结构成员

11.1、下标引用操作符 [ ]

操作数:一个数组名 + 一个索引值
在这里插入图片描述

11.2、函数调用操作符 ( )

接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数
在这里插入图片描述

11.3、.访问一个结构的成员

. 结构体.成员名
-> 结构体指针->成员名
在这里插入图片描述

十二、表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定。
同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型

12.1、 隐式类型转换

C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

例如:char a,b,c;

a = b + c;

b和c的值被提升为普通整型,然后再执行加法运算。
加法运算完成之后,结果将被截断,然后再存储于a中

12.1.1、如何进行整体提升呢?

整型提升:
1、负数的整型提升
2、正数的整型提升
3、无符号数的整型提升,高位补0在这里插入图片描述

这里是引用

12.2 、算术转换

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

12.3 、操作符的属性

复杂表达式的求值有三个影响的因素。

  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序。
    两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
    操作符优先级
    在这里插入图片描述

这段代码在这些编译器上得到的值是不一样的,这就说明在代码运算的先后顺序是没有确定的,
而在以后写代码的时候一定要确定代码计算的顺序这里是引用

我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Später321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值