算数操作符
加+
减-
乘*
除/
取模(求余数)%
细节说明:
如果是两个整数间的运算,3/2的结果是商1而不是1.5,想要得到余数就需要用3%2
另外,要想算出1.5,则需要使至少一个数值为浮点型,也就是3.0/2,才能得出1.5
对于初学者这是个很容易踩坑的地方
移位操作符
>> <<
二进制向右移位和向左移位
比较抽象,来举个例子
2用二进制表示为10,那么我们向左移动一位默认低位补0,也就是100,就是十进制的4
于是很容易得出结论,每左移一位相当于扩大两倍
左移n位?相当于扩大2的n次方倍
同理,对8 (二进制为1000) 进行右移,移动一位100,变成了十进制的4,缩小了一半
所以每右移一位,相当于变为原来的一半
右移n位?相当于缩小至原来的1/2的n次方倍
位操作符
& 按位与
^ 按位异或
| 按位或
&运算可以理解为乘,在二进制中只有0和1,所以只要有一个数为0,&的结果一定为0
只有当两者都为1时,&的结果才可能为1
0&0=0
0&1=0
1&0=0
1&1=0
|为 或 运算,可以理解为加
只要有一个数为1,那么最终结果一定为1,只有两个数都为0,结果才可能为0
1 | 0 = 1
0 | 1 = 1
1 | 1 = 1
0 | 0 = 0
^为异或操作,异或即不同的时候才或,而两个二进制数不同的时候或的结果一定为1,所以异或简单来水就是两数不同的时候结果为1,其他情况为0;因此可推理出同或就是相同的时候结果才为1
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
这里如果不太理解可以去看看离散数学的真假,1为真,0为假
与运算同真则真,或运算同假才假,异或不同为真,同或相同为真
赋值操作符
=
这是赋值符号,不可理解为等于,C语言中的等于是==
下面这些是将前面的运算符和=进行复合的操作符
+=
-=
*=
/=
%=
&=
^=
|=
>>=
<<=
看起来很复杂,其实是一种简便的写法
比如a = a + 1简写为 a += 1,其余类比即可
单目运算符
啥叫单目?就是只涉及一个数值
! 逻辑反
真值取反就是假,假取反就是真
在C语言中认为0为假,其余数都为真
!1 假 !2 假 !0 真
- 负
-1 -2.3
+ 正
+1 +2.3
& 取地址值
获取变量在内存中存放的地址数,十六进制表示(在内存章节会说明)
* 解引用
取得对应地址的数值
sizeof 操作数的类型长度,单位字节
前面已经用过
~ 二进制数按位取反
~1011 结果为 0100
-- 递减
--a -号在前面,表示先计算-1,再使用变量a
a-- 变量a在前,表示先使用变量a,再-1
举例:
int a = 3;
int b = a--;
请问a,b的值为多少?
a在前,先使用a的值3,赋值给b后,a再-1,因此a为2,b为3
那如果是int b = --a;呢?
--在前,a先-1,再赋值给b,因此a和b都为2
++ 递增
同理递减
(类型) 强制类型转换
(int)3.14的结果为3,强制把一个浮点转换成了整型
关系运算符
==等于
>大于
>=大于等于
<小于
<=小于等于
!=不等于
注意关系运算符的结果一定为 真 假
逻辑操作符
逻辑与&&
全真则真
逻辑或||
全假才假
条件操作符
exp1 ? exp2 : exp3
吃了没 ?吃了 :没吃
对于exp1的值,为真则执行exp2,为假执行exp3
举例:
int a = b > 0 ? 1 : 0;
如果b大于0则a赋值1,否则赋值0
逗号表达式
表达式最终取值为最后一个表达式的值
举例:
int a = 1, b = 2, c =3;
int d = (c = a -1, a = b + c, c - 1);
最终把c-1的值赋值给d,但是这不代表前两个表达式没用,还是需要计算的,只不过最后的表达式作为最终值给了d
下标引用
arr[0]
函数调用
hello()
结构体成员
student.age
student->name