一、移位操作符
左移操作符:
左边丢弃,右边补零
右移操作符:
1、算数移位:
右边丢弃,左边补原符号位
2、逻辑移位:
右边丢弃,左边补0
警告:对于移位运算符,不要移动负数位,这个是标准未定义的。例如:
int num = 10;
num >> -1;//error
#include<stdio.h>
int main()
{
//>>--右移操作符(算数移位:右边丢弃,左边补原符号位)
//移动的是二进制位
int a = -1;
//10000000000000000000000000000001-原码
//11111111111111111111111111111110-反码
//11111111111111111111111111111111-补码
int b = a >> 1;
printf("%d\n",b);
return 0;
}
二、位操作符
& //按位与
| //按位或
^ //按位异或
注:它们的操作数必须是整数
#include<stdio.h>
int main()
{
//&-按二进制位与
int a = 3;
int b = 5;
int c = a&b;
int d = a | b;
int e = a^b;
//00000000000000000000000000000011
//00000000000000000000000000000101
//00000000000000000000000000000001-按位与
//00000000000000000000000000000111-按位或
//00000000000000000000000000000110-按位异或
printf("%d\n%d\n%d\n", c,d,e);
return 0;
}
代码执行:
eg1、交换两个int变量的值,不能使用第三个变量,即a=3,b=5,交换之后a=5,b=3.
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("before:a=%d,b=%d\n",a,b);
//加减法-可能会溢出
/*
a = a + b;
b = a - b;
a = a - b;
*/
//异或的方法
a = a^b;
b = a^b;
a = a^b;
printf("after:a=%d,b=%d\n",a,b);
return 0;
}
代码实现:
eg2、编写代码,求一个整数存储在内存中的二进制中1的个数
方法一:
#include<stdio.h>
int main()
{
int num = 0;
int count = 0;
scanf("%d",&num);
//统计num的补码中有几个1
int i = 0;
for (i = 1; i <= 32; i++)
{
if ((num >> i) & 1 == 1)
count++;
}
printf("count=%d\n", count);
return 0;
}
代码实现:
方法二:
#include<stdio.h>
//方法二:
int main()
{
int num = -1;
int count = 0;
while (num)
{
count++;
num = num&(num - 1);
}
printf("count=%d\n",count);
return 0;
}
三、赋值操作符
复合赋值符:+=、-=、>>=等
四、单目操作符
!、-、+、&、sizeof、~、--、++、*(间接访问操作符(解引用操作符))、强制类型转换
五、关系操作符
六、逻辑操作符
&& 、||
#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\n d=%d\n",a,b,c,d);
return 0;
}
代码执行:
因为当执行a++=0的时候,后面c、d就不会执行,然后a自增
#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\n d=%d\n",a,b,c,d);
return 0;
}
与上面类似,最终是1、3、3、4
七、条件操作符(三目)
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int max = 0;
max = (a > b ? a : b);
printf("max=%d\n", max);
return 0;
}
代码实现:
八、逗号表达式
逗号表达式,就是用逗号隔开的多个表达式。逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
九、下标引用、函数调用和结构成员
#include<stdio.h>
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);
printf("max=%d\n", max);
return 0;
}
代码实现:
#include<stdio.h>
//学生
struct Stu
{
char name[20];
int age;
char id[20];
};
int main()
{
int a = 10;
//使用struct Stu这个类型创建了一个学生对象s1,并初始化
struct Stu s1 = { "张三", 20, "20210621" };
struct Stu* ps = &s1;
//结构指针->成员名
printf("%s\n",ps->name);
printf("%d\n", ps->age);
printf("%s\n", ps->id);
//结构变量.成员名
printf("%s\n",s1.name);
printf("%d\n", s1.age);
printf("%s\n", s1.id);
return 0;
}
代码实现:
十、整形提升
int main()
{
//00000011-a
char a = 3;
//01111111-b
char b = 127;
//10000010-a+b
char c = a + b;
//11111111111111111111111110000010-补码
//11111111111111111111111110000001-反码
//10000000000000000000000001111110-原码
//-126
printf("%d\n",c);
return 0;
}
十一、算数转换
long double
double
float
unsigned long int
long int
unsigned int
int