这篇博客主要是对C语言中的一些操作符进行讲解和其应用的分析。
目录
移位操作符
移位操作符有2种:
左移操作符 <<
右移操作符 >>
提示:移位操作符,移的是二进制位,即对补码进行移动操作。
应用分析:
左移操作符的移动规则:
左边抛弃,右边补0
右移操作符的移动规则:
右移运算有2种,①逻辑移位 ②算术移位
①逻辑移位:右边抛弃,左边补0
②算术移位:右边抛弃,左边补符号位
位操作符
按位与 &
按位或 |
按位异或 ^
提示:位操作符的操作数必须是整数,也是对补码进行位运算的。
应用分析:
按位与 &
全1为1,有0则0。(2个数同时为1的位才为1,一旦有1个是0则是0)
按位或 |
有1为1,全0才为0。(2个数只要有1个是1则为1,同时为0才为0)
按位异或 ^
相同为0,相异为1.(2个数相同为0,不同为1)
例:求一个整数在内存中的二进制中的1的个数
int main() { int num = -1; int count = 0; int i = 0; for (i = 0;i < 32;i++) { if ((num >> i) & 1) count++; } printf("%d\n", count); return 0; }
实际上这里有种更简单的方法,可以大大提高效率
(每次与自己-1进行按位与操作,这样有几个1就进行几次运算)
int main() { int num = -1; int count = 0; while (num) { num = num & (num - 1); count++; } printf("%d\n", count); return 0; }
逻辑操作符
逻辑与 &&
逻辑或 ||
逻辑非 !
提示:逻辑操作符,只关注“真”和“假”。
应用分析:
我们先来看一道题
int main() { int a = 0; int b = 1; int c = 2; int d = 3; int i = a++ && b++ && ++c && d++; printf("i=%d a=%d b=%d c=%d d=%d", i, a, b, c, d); return 0; }
这道题的结果是:i = 0, a = 1, b = 1, c= 2, d = 3。
对于逻辑与这个操作符,只要前面有一个条件为假,那么将不进行后面的运算。
对于逻辑或则是同理,只要前面有一个条件是真,那么将不进行后面的运算。
逗号表达式
exp1, exp2, exp3, ...expN
提示:逗号表达式的结果,是最后一个表达式的结果。该表达式是从左向右依次执行。
应用分析:
int a = 1;
int b = 2;
int c = ( a = a+b, a++, a<b, b);
c的值是什么?
c的值是 2,即c的值等于b,也就是该逗号表达式中的最后一个表达式的结果
条件操作符
exp1 ? exp2 : exp3
应用分析:
求2个数的较大值
int main() { int a = 10; int b = 20; int Max = (a > b) ? (a) : (b); printf("%d\n", Max); return 0; }
关于表达式求值的顺序
1. 操作符的优先级
2. 操作符的结合性
3. 操作符是否控制求值顺序
(2个相邻的操作符,先比较他们的优先级高低,如果优先级相同,那么在比较他们的结合性)