在学习这章节之前呢,咱们先了解一下操作符的分类(有哪些操作符)
目录
算术操作符
+ - * / %
这里提一点 除号想要得到小数是要技巧的:
这里是为了更好的演示,实际上第一个式子应该用%d来打印的。
所以得出结论:除法操作符的两个操作数都是整数的话,进行的是整数除法。
有一个浮点数的话,就进行的是小数除法。
而%取模操作符的操作数必须都是整数。
移位操作符
<< >> 左移操作符和右移操作符
这里的两个操作符的对象是二进制的“补码”
正整数:二进制的原码,反码,补码都相等。
负整数:二进制的原码符号位不变,其它位按位取反变成反码,反码通过+1变成补码。
符号位是该数字二进制位最高的一位,0表示正,1表示负。 例如:
提一点:整数正在内存中存储的是补码,而我们一般看到的或者拿到的都是整数的原码。
左移操作符 <<
二进制的补码向左移动几位就丢弃几位,同时向右边补几位0.
举例说明:
右移操作符 >>
编译器采用的都是算数右移噢
逻辑右移
左边用0填充,右边丢弃。
算数右移
左边用原来的数值的符号位填充,右边丢弃。
位操作符
& | ^ 按位与,按位或,按位异或
操作对象同样是整数二进制的补码。
按位与 &
两个整数的二进制序列对应的二进制序列中都为1则为1,否则就位0.
提一点:这里按位与之后的符号位是0,则为正,所以原,反,补相同,如果符号位为1,则为负 数,那么得出的结果就是补码,我们需要求出原码的结果才是变量c的值。
按位或 |
两个整数的二进制序列对应的二进制序列中有一个为1则为1,否则就为0.
按位异或 ^
两个整数的二进制序列对应的二进制序列中相同则为0,相异则为1。(同假异真)
编译就留给聪明的你了!
赋值操作符
=
对数据重新赋值
复合赋值符
+= -= *= /= %= >>= <<= &= |= ^=
a+=3 a=a+3//等价
a&=3 a=a&3//等价
a>>=3 a=a>>3//等价
单目操作符
逻辑反操作 !
这里 !flage 等价于flage==0
取地址操作符 &与解引用操作符
详细可见:
操作数的类型长度 sizeof
以字节为单位,计算的是所占内存空间的大小。
注意了,sizeof 是操作符,计算的是操作数的类型长度,与操作数的数值无关,可万万不能把它当作函数了呀!
前置++(--)后置++(--)
++也是同样的道理。
关系操作符
逻辑操作符
&& 逻辑与
|| 逻辑或
操作对象是数值的真假
&&逻辑与,操作数都为真才为真,返回1
|| 逻辑或,操作数有一个为真就为真,为假返回0
经典例题一道:
解:这里的a++是后置++,先使用后++,所以就是0&&后面的值,而&&的规则是只要一个为假就为假,从左往右看,第一个为假,则后面的表达式不执行,因为后面的表达式就算执行了也无意义(不影响结果),所以就直接跳出该行代码,执行下一行。那么 || 也同理,赶紧练起来吧!
条件操作符
先判断表达式1(exp1)的结果,为真则计算表达式2,表达式3不计算。为假则计算表达式3,表达式2不计算。
逗号表达式
小提一道:
下标引用,函数调用和结构成员
[ ] 下标引用操作符
() 函数调用操作符
. 结构体.成员名
-> 结构体指针->成员名
而这里的下标引用操作符[ ]的两个操作数分别是arr和10