C语言05-操作符12

1 移位操作符

1
2
3
<< 左移操作符
>> 右移操作符
注:移位操作符的操作数只能是整数

1.1 左移操作符

左边抛弃、右边补0

1.2 右移操作符

  1. 逻辑移位
    左边用0填充,右边丢弃
  2. 算术移位(常用)
    左边用原该值的符号位填充,右边丢弃

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;
// 00000000 00000000 00000000 00001011
// 将倒数第三位改成1:或1上去
// 00000000 00000000 00000000 00000100
// 00000000 00000000 00000000 00001111

// 00000000 00000000 00000000 00000100 可以是1向左移动两位(1<<2)
a = a|(1<<2); //15


// 00000000 00000000 00000000 00001111
// 将到时第三位变成0:按位与0
// 11111111 11111111 11111111 11111011
// 00000000 00000000 00000000 00001011

// 11111111 11111111 11111111 11111011可以是00000000 00000000 00000000 00000100 按位取反得到,00000000 00000000 00000000 00000100 可以是1向左移动两位(1<<2)

a = a&(~(1<<2)); //11

4 逻辑操作符

1
2
&& 逻辑与
|| 逻辑或
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++;
//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 右边不管什么数都为假,不算了 ,所以++bd++ 都没有运算。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
exp1, exp2, exp3, …expN

逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。

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
. 结构体.成员名
-> 结构体指针->成员名
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,并初始化
struct Stu stu = {"张三",20,"20210304"};
struct Stu* ps = &stu;//结构成员访问

printf("%s\n",stu.name);
printf("%s\n",ps->name);
printf("%s\n",(*ps).name); // 与ps->name相同
return 0;
}

C语言05-操作符12
https://blog.966677.xyz/2023/09/10/C语言05-操作符12/
作者
Zhou1317fe5
发布于
2023年9月10日
许可协议