分类:
- 算术操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号表达式
- 其他操作符(下标引用、函数调用和结构成员)
一、算数操作符
1、算术操作符包括:+ 、— 、 * 、/ 、%
2、加、减、乘操作符和平常数学中的运算法则相同。
3、除法操作符左右两边操作数为整型,则执行整数除法,只要有一个操作数为浮点型,则执行浮点型除法。
4、取余操作符左右两边操作数必须为整数。
二、移位操作符
1、移位操作符包括:<< 左移操作符,>> 右移操作符
2、左移操作符移位规则:左边抛弃,右边补0
//正数:原码=反码=补码 //负数:反码=原码除符号位取反 补码:反码+1 int num = 10; //00000000 00000000 00000000 00001010 num << 2; //00000000 00000000 00000000 00101000 int num = -10; //11111111 11111111 11111111 11110110 num << 2; //11111111 11111111 11111111 11011000//正数:原码=反码=补码 //负数:反码=原码除符号位取反 补码:反码+1 int num = 10; //00000000 00000000 00000000 00001010 num << 2; //00000000 00000000 00000000 00101000 int num = -10; //11111111 11111111 11111111 11110110 num << 2; //11111111 11111111 11111111 11011000
3、右移操作符移位规则:
逻辑移位:右边抛弃,左边用0填充
算数移位:右边抛弃,左边用原数字的符号位填充
int num = -1; //11111111 11111111 11111111 11111111 num >> 1; //算数移位: //11111111 11111111 11111111 11111111 //逻辑移位: //01111111 11111111 11111111 11111111 int num = 2; //00000000 00000000 00000000 00000010 num >> 1; //算数移位: //00000000 00000000 00000000 00000001 //逻辑移位: //00000000 00000000 00000000 00000001
注意:移位操作符移动的是二进制位,不能移动负数位。
三、位操作符
1、位操作符包括:&按位与 、|按位或 、^按位异或
2、两个数字相同异或等于0,0和任何数字异或得该数字
3、给定一组数字,除一特殊数字外,其他都成对出现,找出该数字:异或所有数字
//不创建临时变量,实现两数字交换 int a = 10; int b = 20; a = a^b; b = a^b; a = a^b; printf("a = %d b = %d ",a,b); //求一整数在内存中的二进制中1的个数 int num = -1; int i = 0; int count = 0; while(num)) { count++; num=num&(num-1) } printf("二进制中1的个数:%d",count);
四、赋值操作符
1、普通赋值操作符:=
2、复合赋值符:+= 、-= 、*= 、/= 、%= 、>>= 、<<= 、&= 、|= 、^=
int a = 10; int x = 20; int b = a+x; x += 2; a *=2;
五、单目操作符
1、单目操作符包括:
!逻辑反 //一般用于表示真假
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符
(类型) 强制类型转换
2、sizeof()为操作符,不为sizeof()函数,()中可以为类型,也可为变量,为变量时()可以去掉,()中为数组名计算的是数组字节数
3、数组名arr取的是数组首元素的地址,&arr取的是整个数组的地址 //int (*p3)[10]=&arr; p3是一个数组指针
4、关于数组名的扩充:
- 数组名可以表示整个数组 : (1)、sizeof(数组名)(2)、&数组名
- 数组名可以表示首元素地址 : 除以上两种情况外,数组名都表示首元素地址
void test1(int arr[]) { //计算传来首元素指针大小 printf("%d ",sizeof(arr));//4 } void test2(char ch[]) { //计算传来首元素指针大小 printf("%d ",sizeof(ch));//4 } int main() { int arr[10] = {0}; char ch[10] = {0}; //计算数组的字节大小 printf("%d ",sizeof(arr));//40 printf("%d ",sizeof(ch));//10 test1(); test2(); }
六、关系操作符
1、关系操作符包括:> 、>= 、< 、<= 、!= 、==
2、注意等于时用==,=为赋值操作符
七、逻辑操作符
1、逻辑操作符包括:&&逻辑与 、||逻辑或
2、对于逻辑与,左边为假,后边都不运算
3、对于逻辑或,左边为真,后边都不运算
int i = 0,a = 0,b = 2,c = 3,d = 4; i = a++ && ++b && d++; printf("%d %b %b %b",a,b,c,d);//1 2 3 4 i = a++ || ++b || d++; printf("%d %b %b %b",a,b,c,d);//2 2 3 4
八、条件操作符
exp1 ? exp2 :exp3
九、逗号表达式
exp1 ,exp2 , exp3,……expN
逗号表达式,就是用逗号隔开的多个表达式。逗号表达式,从左到右执行,整个表达式的结果是最后一个表达式的结果
十、其他表达式(下标引用、函数调用和结构成员)
1、[ ]下标引用操作符
操作数:一个数组名+一个索引值
2、()函数调用操作符
接受一个至多个操作数,第一个为函数名,其他给函数传递实参
3、访问一个结构成员
- 结构体.成员名
->结构体指针->成员名