分类:
算术操作符 + - * / %
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
移位操作符
<< 左移操作符 >> 右移操作符
左移分为逻辑左移和算数左移,这两个左移规则相同
左移规则:二进制数整体向左移动移位,最左边的一位抛弃,最右边补0。
例: 00000000 00000000 00000000 01010100
左移一位 0<---0000000 00000000 00000000 01010100<---0
右移分为逻辑右移和算数右移,这两个右移规则不同
逻辑右移规则:二进制数整体向右移动移位,最右边的一位抛弃,最左边补0。
例: 00000000 00000000 00000000 01010100
逻辑右移一位 0-->00000000 00000000 00000000 0101010-->0
算数右移规则:二进制数整体向右移动移位,最右边的一位抛弃,最左边补原来的符号位。
例: 10000000 00000000 00000000 01010100
算数右移一位 1-->10000000 00000000 00000000 0101010-->0
位操作符
按位与 & 按位或 | 按位异或 ^
注:他们的操作数必须是整数
赋值操作符 =
注意可以连续赋值,但不建议使用
例: a = b = c+1; 相当于 b = c+1; c = b;
复合赋值符 += -= *= /= %= >>= <<= &= |= ^=
用法 i+=1; 就相当于i = i +1; 其他同理;
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
int arr[] = {'0','1','2'};
sz0 = size(arr[0]);
sz = sizeof(arr)/sizeof(arr[0]);
可以得到下标为0的元素的类型长度sz0和数组中的元素个数sz
~ 对一个数的二进制按位取反
取反时用的补码
-- 前置、后置-- ++ 前置、后置++
前置++/--,先++/--,再操作
后置++/--,先操作,再++/--
例: a = i++; 后置++,先将i的值赋给a,再对i进行++
b = --i; 前置--,先对i进行--,再将--后的i赋给b
* 间接访问操作符(解引用操作符)
例: int* p = 0; 创建了一个整形指针变量p,指针变量中存的是地址,要对p的值进行改变,就要解引用
*p = 20; 通过p的地址找到存储块,将20赋给p
(类型) 强制类型转换
float a = 3.14; 只要得到整数3,就可以用强制类型转换 b =(int)3.14,这里b = 3;
关系操作符 > < >= <= == !=
注意:区分等于== 和 赋值操作符 =
逻辑操作符 逻辑与&& 逻辑或||
注意:区别 逻辑与&& 与按位与& ,逻辑或|| 与按位或|
特点:n = (0 && i++); 逻辑与&& 前操作数若为假,则结果为假,n = 0;后操作数不进行运算,所以i不发生变化
m = (1 || --i); 逻辑或|| 前操作数若为真,则结果为真,m = 1;后操作数不进行运算,所以i不发生变化
条件操作符 exp1 ? exp2 : exp3
就相当于 a>b ? c=a : c=b 或 c = a>b ? a : b
逗号表达式 exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。
例:int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);
从左向右依次执行,第一个表达式无意义,第二个表达式得到a=12,第三个表达式无意义,第四个表达式得b=13
结果是最后一个表达式的结果,所以c = 13;
下标引用、函数调用和结构成员
1. [ ] 下标引用操作符
操作数:一个数组名 + 一个索引值
int arr[10]; 创建数组
arr[9] = 10; 使用下标引用操作符,[ ]的两个操作数是arr和9。
2. () 函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
3. . 和 -> 访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名