移位操作符 操作符 功能 << 左移操作符 >> 右移操作符 移位操作符作用的对象是一个数的补码;对于左移:左边抛弃,右边补0;对于右移:右边抛弃,左边补原来的符号位(采用算术移位);
对于左移操作符,分为两种移位规则:
逻辑移位左边最高位直接补0,右边丢弃,不考虑之前数的符号位。
算术移位左边最高位用之前数的最高位符号位填充,是右边丢弃,左边最高位和之前数相同的符号位。目前编译器通常采用的是算术移位规则。 注意:对一个数移位操作完成后,当前的数不会改变的,除非把它赋值给另外一个变量。 对于移位操作符,不要移动负数位,这个是标准未定义的。 注:左移操作相当于给之前的数乘2,右移操作相当于给之前的数除2; 例:求一个整数存储在内存中的二进制中1的个数。
#include<stdio.h> #include<stdlib.h> int count_one_bits( int value) { int count=0; while (value) { value &= value - 1; count++; } return count; } int main() { printf("%u\n",count_one_bits(15)); system("pause"); return 0; } 位操作符操作符 功能 & 按位与 丨 按位或 ^ 按位异或
位操作符作用的对象也是一个数的补码,并且它们的操作数必须是整数。 例:不能创建临时变量,实现两个数的交换
#include<stdio.h> #include<stdlib.h> int main() { int a = 1; int b = 2; a = a^b; b = a^b; a = a^b; printf("%d %d\n", a,b); system("pause"); return 0; }赋值操作符 操作符 功能 = 给变量赋值
注:不要连续赋值
复合赋值符 操作符 功能 +=(-= ) 相加之后赋值(相减之后赋值) /= 相除之后赋值 *= 相乘之后赋值 %= 取余之后赋值 >>= 右移之后赋值 <<= 左移之后赋值 |= 按位或之后赋值 ^= 按位与之后赋值
使用用复合操作符可以使代码更简洁。
单目操作符 操作符 功能 ! 逻辑反操作 + 正值 - 负值 & 取地址 sizeof 操作数的类型长度(以字节为单位) ~ 对一个数的二进制按位整体取反 -- 前置、后置-- ++ 前置、后置++ * 间接访问操作符(解引用操作符) (类型) 强制类型转换sizeof操作符(不是函数)计算的是变量(类型)所占空间的大小,是按字节来计算,而且sizeof (a+b)里面的表达式不参与计算,若a,b都是int行类型,其结果依然是4; 当数组作为参数为函数传参时,由于数组要发生降维,其会降维成指向其内部元素类型的指针,如果此时在一个函数中sizeof计算数组的大小是不可以的,其计算的是数组降级为指针的大小(4个字节),所以,若函数要得到一个数组的大小,应该在主函数中计算。 对于前置++或 - -,先操作,再使用,对于后置++或 - -,先使用,再操作。 关系操作符 操作符 功能 > 大于 < 小于 <= 小于等于 >= 大于等于 != 不等于 == 等于
需要注意,不要将等于(==)写成赋值操作(=)。
逻辑操作符 操作符 功能 && 逻辑与 || 逻辑或 条件操作符exp1?exp2:exp3 exp1为真,结果为exp2,否则结果是exp3
逗号操作符exp1,exp2,…expN
从左往右依次执行,整个表达式结果是最后一个表达式的结果
下标引用、函数调用和结构成员 操作符 功能 [ ] 数组下标操作符,操作数:数组名+一个索引值 ( ) 函数调用操作符,接受一个或多个操作数:第一个是函数名,其余是函数参数 . 访问结构体成员 -> 访问结构体成员