1 移位操作符
1 2 3
| << 左移操作符 >> 右移操作符 注:移位操作符的操作数只能是整数
|
1.1 左移操作符
左边抛弃、右边补0

1.2 右移操作符
- 逻辑移位
左边用0填充,右边丢弃
- 算术移位(常用)
左边用原该值的符号位填充,右边丢弃

2 位操作
| 符号 |
描述 |
运算规则 |
| & |
按位与 |
两个位都为1时,结果才为1 |
| | |
按位或 |
两个位都为0时,结果才为0 |
| ^ |
按位异或 |
两个位相同为0,相异为1 |
| 注:他们的操作数必须是整数。 |
|
|
练习1
不能创建临时变量(第三个变量),实现两个数的交换。
1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h> int main() { int a = 10; int b = 20; a = a^b; b = a^b; a = a^b; printf("a = %d b = %d\n", a, b); return 0; }
|
练习2
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <stdio.h> int main() { int num = -1; int i = 0; int count = 0; for(i=0; i<32; i++) { if( 1==((num>>i)&1) ) count++; } printf("二进制中1的个数 = %d\n",count); return 0; }
|
3 单目操作符
sizeof
1 2 3 4
| printf("%d\n", sizeof(a)); printf("%d\n", sizeof(int)); printf("%d\n", sizeof a); printf("%d\n", sizeof int);
|
sizeof 后面是类型时不可以省略括号。
~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| int a = 11;
a = a|(1<<2);
a = a&(~(1<<2));
|
4 逻辑操作符
1 2 3 4 5 6 7 8 9
| #include <stdio.h> int main() { int i = 0,a=0,b=2,c =3,d=4; i = a++ && ++b && d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d); return 0; }
|
结果: 1 2 3 4
a++ 先试用后加加,所以 a++ && ++b && d++ 中 a++ 为0,&& 左边为0 右边不管什么数都为假,不算了 ,所以++b 和 d++ 都没有运算。a++ 自增后变为1。
1 2 3 4 5 6 7 8
| #include <stdio.h> int main() { int i = 0,a=1,b=2,c =3,d=4; i = a++||++b||d++; printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d); return 0; }
|
结果 2 2 3 4
5 逗号表达式
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
1 2 3
| int a = 1; int b = 2; int c = (a>b, a=b+10, a, b=a+1);
|
结果 13
6 函数调用操作符( )
1 2 3 4 5 6 7 8 9 10 11 12
| int get_max(int x,int y) { return x>y?x:y; }
int main() { int a =10; int b =20; int max = get_max(a,b); return 0; }
|
调用函数时候的 () 就是函数调用操作符,该函数操作数有三个,为get_max a b
7 访问一个结构的成员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <stdio.h> struct Stu { char name[10]; int age; char id[20]; }
int main() {
struct Stu stu = {"张三",20,"20210304"}; struct Stu* ps = &stu;
printf("%s\n",stu.name); printf("%s\n",ps->name); printf("%s\n",(*ps).name); return 0; }
|