- 操作符
- 操作符分类:
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
- 算术操作符
其中包括+,-,*,/,%
其中比较特殊的%,求余%两边只能是整数。其他的几个浮点数和整数ok。
对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
- 移位操作符
& //按位与 有0为0,双1为1
| //按位或 有1为1,双0为0
^ //按位异或 相同为0,相异为1
注:他们的操作数必须是整数。
补充一下:这里的运算规则是用二进制的补码来运算的
例:当交换两个数(不使用第三个变量)
- 二进制的原码,补码以及反码
二进制由0和1组成
二进制是这样的。以15为例(32位):
000000000000000000000000001111;这里的四个1分别对应:2的3次方 2的2次方 2的1次方 2的0次方
二进制转换为10进制是这样的:2的3次方*1+ 2的2次方*1+ 2的1次方*1+ 2的0次方*1=15
上面的二进制为二进制的原码。第一位为符号位:0为负,1为正
反码为除了符号位,原码0 1互换,0变1,1变0
补码是反码加1,逢二进一
其中值得注意的是正整数的原反补码都相同
- 移位操作符
左边抛弃、右边补0
>> 右移操作符
分为两种
.逻辑移位
左边用0填充,右边丢弃
2算术移位
左边用原该值的符号位填充,右边丢弃
注:移位操作符的操作数只能是整数。
对于移位运算符,不要移动负数位,这个是标准未定义的
补充一下:这里的运算规则是用二进制的补码来运算的
例:统计二进制中1的个数
例:求两个数二进制中不同位的个数
- 赋值操作符=
这个就是常见的赋值操作符;例如:int i=0;
他有很多复合操作符+=,-=,*=,/=,%=,
他们的运算方法跟+=一样。例如:a+=6 ==== a=a+6
- 单目操作符
其中比较值得注意的是sizeof
这个代码中sizeof(arr)是,sizeof看到访问的是arr整个数组,有int型的大小是4,所以4*10=40
sizeof(arr[10])这里是否越界访问了,其实是没有的,sizeof只是判读是int型,它并没有进去,哪怕是arr[11]也不会越界访问
例:
第一个a是可以的,会打印4,第二个是不可以的,会报错
所以呢,sizeof可以不加括号来访问变量,但不可以不加变量来访问数据类型。
这里为啥呢?
其实是这样的,一般来说,s=2+5=7嘛,但其实
这里会发生截断,sizeof()括号里面的东西不进行计算,sizeof发现了s是short类型的,返回2嘛,然后下面s还是10.
- ~ 对一个数的二进制按位取反
是将每一位按位取反,包括符号位
- i++和++i
++a
先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值
a++
先对a先使用,再增加
- 关系操作符
= <
两个字符串不能用==来判断是否相等
警告:
在编程的过程中== 和=不小心写错,导致的错误。
例:
答案应该是1 2 3 4
是这样a++先使用a,又因为a=0,所以0&&++b,这样的话++b就没有必要算,直接等于0,同理d++也没有算。
- 逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
虽然逗号表达式是算最后一个表达式的值,但前面的表达式也得算,因为,前面的表达式,可能会使变量的值改变
- 算术转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类
型,否则操作就无法进行。下面的层次体系称为寻常算术转换。