操作符
指令系统的每一条指令都有一个操作符,它表示该指令应进行什么性质的操作。
可能你还是不太懂,没事看我介绍完,你就明白了。
比如数学中的加减乘除就是操作符!
算数操作符
简单地说,进行数学的算数运算就是算数运算符
int a=5,b=2; //错误运算 int sum1=a/b; //2 两数都是整型 int sum2=a/(float)b; //2 未存放在浮点型中 float sum3=a/b; //2 两数都是整型 //正确运算 float sum=a/(float)b; // 2.5
移位操作符
右移运算符 >>
左移运算符 <<
这里的位指的是2进制位
联系我们的十进制移位
小数点不动,数据移动
12.3 右移一位 >> 1.23 结果缩小10倍
12.3 左移一位 << 123. 结果扩大10倍
所以2进制的移位扩大2的倍数
因为计算机存储的位数是固定的,
数据是以补码的形式存储的。
我们来了解一下原码,反码,补码的概念。
符号位:正数的符号位用0表示 负数为1
原码:带有符号位的二进制位
反码:除符号位外原码的2进制位取反
补码:反码加1
为啥要引入补码这个概念呢?
因为计算机只能进行加法和移位操作
原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
12 二进制表示 1100 储存在8位机器中 且有一位符号位 符号位:正数的符号位用0表示 负数为1 原码 反码,补码 0,0001100 -12 原码 1,0001100 反码 1,1110011 补码 1,1110100
所以移位移动的是补码的二进制位
因为机器字长的原因
移位后数据减少移位需要添加移位
正数
左移右边添0
右移左边添0
负数
左移右边添0
右移左边添1
位操作符
二进制位运算
赋值操作符
= += -= *= /= %= ......
赋值“=”可以和很多运算符组合,就不一一列举
1 a=a+3; b=b*3; 简化 2 a+=3; b*=3; 1和2等价
这就是赋值操作符的组合,C语言代码经常这样书写。
“=”在不同的位置含义不同,列如
int a=12; //初始化非赋值 a=10; //赋值操作
单目操作符
单目就是只有一个操作数
| 负值
| 正值
& | 取地址
sizeof | 操作数的类型长度(以字节为单位)
~ | 对一个数的二进制按位取反
– | 前置、后置–
++ | 前置、后置++
| 间接访问操作符(解引用操作符)
(类型) |强制类型转换
我们来介绍一些我们还没见过的操作符
!逻辑取反
计算机中以0为假,非0为真,所以非0取反后为0;0取反后为非0;
而vs下规定!0=1
! 通常用于判断语句,下次学习
&取地址操作符 * 解引用操作符
1
我们要先了解一下指针这个概念
指针就是地址,地址就是指针。
联系生活中的,图书馆借书,我们要找到我们要想要借书的位置,那个书架的位置就是它的书的地址,然后我们就可以根据这个地址找到这本书,就好比我们收快递的地址。
而计算机开辟空间存储数据,那块空间就是这个变量的的地址,通常用一串二进制代码表示。
可能你还很懵,不要紧,后期还会学习
~按位取反操作符
同位操作符一样,将一个数的二进制位取反
++自加 -- 自减
我们通常写循环语句的时候要将 i 递增加减
i=i+1; 等价 i++; ++i; i=i-1; i--; --i;
是否发现上面 有前置加加和后置加加
++i 和 i++有什么区别吗?
同样是自加,为啥前置和后置的计算结果不一样呢?
前置加加,先自加后使用
后置加加,先使用后加加
自减也是如此
所以++i 先计算i=i+1后再打印
而 j++ 先打印 j 再计算j=j+1;
(类型) 强制类型转换
int a=5,b=2; float sum=a/(float)b; //将int类型b强制转换成float类型
关系操作符
> >= < <= != 用于测试“不相等” == 用于测试“相等”
上面的操作符都用于判断俩数的大小关系 属于双目操作符
int a=10,b=12; if(a>b) { printf("a>b\n"); } if(a==b) //测试判断a与b是否等于 { printf("a==b\n"); } if(a!=b) //测试“不相等” { printf("a!=b\n"); }
注意:
测试等于关系操作符是“ ==” 而不是“=”
“=”是赋值操作符
逻辑操作符
&& 逻辑与 (数学中的并且) || 逻辑或 (数学中的或者)
&& 要左右两个表达时同为真,就是两个表达式结果都不为0
|| 一个表达式为真就为真 ,两个表达式结果有一个为非0就为真
逻辑运算符计算规则
||表达式依次计算,直到有一个表达式结果为非0就停止计算。
&&表达式依次计算,直到有一个表达式结果为0就停止计算
结果为真 整个逻辑表达式值为1;结果为假,整个逻辑表达式值为0。
你是否被这种题目给烦恼到,这么数和操作符;
为啥x=6 y=7 z=9呢?
逻辑运算值只有1和0,真就是1,假就是0,‖只要运算到有一个表达式的值非0就为真,就不会算下去了,&&一直算到0才不会进行计算了,++x前置加加先加加后使用,x++后置先使用后加加。
你试试看,是不是,就那样。
条件操作符
exp1 ? exp2 : exp3
// 求最大值 int max=0,a=3,b=5; if(a>b) { max=a; } else { max=b; } // 等价于 max=(a>b)?a:b
是不是发现条件表达式超简洁!
exp1 ? exp2 : exp3
如果exp1为真,执行exp2,否者执行exp3;
逗号操作符
exp1, exp2, exp3, …expN
表达式从左到右依次计算,最后一个表达式即为运算结果。