算术操作符
+ - * / %
1.除了 % 操作符,其他操作符都可以作用于整数和浮点数.
2.对于 / 操作符,如果两端都为整数,执行整数除法,只要有一端为浮点数就为小数除法
3.%操作符两端必须都为整数,返回的是整除之后的余数
移位操作符
1.左移操作符
左移操作符移动规则: 左边抛弃,右边补0
左移其实移动的是存储在内存中的二进制的补码。
先看一下正数的情况
#include<stdio.h>
int main()
{
int a = 5;
int b = a<<1;
printf("%d",b);
}
// 输出结果为 10
再看一下负数的情况
#include<stdio.h>
int main()
{
int a = -1;
int b = a<<1;
printf("%d",b);
}
// 输出结果为 -2
2.右移操作符
右移操作符分为两类:
1.算数右移:
右边丢弃,左边补符号位
2.逻辑右移
右边丢弃,左边补0
具体采用哪种方式,取决于编译器。
#include<stdio.h>
int main()
{
int a = -1;
int b = a >> 1;
printf("%d",b);
}
// 输出结果为-1
警告: 对于移位运算符,不要移动负数位,这个是标准未定义的。
#include<stdio.h>
int main()
{
int num = 10;
num>> -1;// error
}
位运算符
1.按位与
& : 按二进制(补码)位与 , 都为1才是1,否则为0
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a & b;
printf("%d\n",c);
}
// 输出结果为1
2.按位或
| : 按二进制(补码)位或 , 有一位是1就是1 , 全为0才为0 .
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a | b;
printf("%d\n",c);
}
// 输出结果为7
3.按位异或
^ : 按二进制(补码)位异或 , 相同的为0 , 不相同的为1 .
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a ^ b;
printf("%d\n",c);
}
// 输出结果为6
警告 : & | ^ 只能作用于整形
4.按位与和按位异或的应用
1.按位异或的应用
大家一定都做过交换两个数的值 , 用的最多的方法应该是创建一个临时变量的方
法
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int tmp = a;
a = b;
b = tmp;
printf("a = %d,b = %d", a, b);
}
// 输出结果 a = 5, b = 3
现在要求不创建临时变量,交换两个整数的值,可能有人会想到下面这种做法
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
a = a + b;
b = a - b;
a = a - b;
printf("a = %d,b = %d", a, b);
}
// 输出结果 a = 5, b = 3
但这种做法有缺陷 ,如果我们的a , b比较大,但还没有超出整形的范围,但a + b就会发
生溢出,导致结果错误。
现给出按位异或的做法
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d,b = %d", a, b);
}
// 输出结果 a = 5, b = 3
2.按位与的应用
求一个整数存储在内存中二进制1的个数
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
while(num)
{
count++;
num = num&(num-1);
}
printf("二进制中1的个数 = %d\n",count);
return 0;
}
赋值操作符
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以
给自己重新赋值。
#include<stdio.h>
int main()
{
int weight = 120;
weight = 89;
double salary = 10000.0;
salary = 20000.0;
// 赋值操作符可以连续使用
int a = 10;
int x = 0;
int y = 20;
a = x = y + 1; // 连续赋值
// 相当于以下代码
x = y + 1;
a = x;
}
复合运算符
+=
-=
*=
/=
%=
》=
《=
&=
|=
^=
int x = 10;
x = x + 10;
x += 10;//复合赋值
//其他运算符一样的道理。这样写更加简洁