目录
1. 操作符分类
算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号表达式下标引用、函数调用和结构成员
2. 算术操作符
+ - * / %
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
3. 移位操作符
<< 左移操作符
>> 右移操作符
注:移位操作符的操作数只能是整数。
3.1 左移操作符
移位规则:左边抛弃、右边补0
int main()
{
int a = 4;
//00000000000000000000000000000100 - 4的补码
//
int b = a << 1;//把a向左移动一位
//00000000000000000000000000001000 -b
printf("a=%d b=%d\n", a, b);//4 8
return 0;
}
int main()
{
int a = -4;
//10000000000000000000000000000100 - -4的原码
//11111111111111111111111111111011 - -4的反码
//11111111111111111111111111111100 - -4的补码
int b = a << 1;//把a向左移动一位
//11111111111111111111111111111000 - b中存储的补码
//11111111111111111111111111110111 - b的反码
//10000000000000000000000000001000 - b的原码
//-8
printf("a=%d b=%d\n", a, b);//-4 -8
return 0;
}
总结:
左移一位,有扩大2倍的效果(扩大一个二进制位)
3.2 右移操作符
移位规则:首先右移运算分两种:1. 逻辑移位左边用0填充,右边丢弃2. 算术移位(绝大部分的编译器采用算数右移)左边用原该值的符号位填充,右边丢弃
int main()
{
int a = -4;
//10000000000000000000000000000100 - -4的原码
//11111111111111111111111111111011 - -4的反码
//11111111111111111111111111111100 - -4的补码
int b = a >> 1;//
//11111111111111111111111111111100
//11111111111111111111111111111110 - b在内存中的补码
//11111111111111111111111111111101 - b的反码
//10000000000000000000000000000010 - b的原码
//-2
printf("a=%d b=%d\n", a, b);// -4 -2
return 0;
}
int main()
{
int a = 4;
//00000000000000000000000000000100 补码
//
int b = a >> 1;//
//00000000000000000000000000000010 补码
printf("a=%d b=%d\n", a, b);//4 2
return 0;
}
总结:
右移一位,有缩小2倍的效果(缩小一个二进制位)
警告 ⚠ :对于移位运算符,不要移动负数位,这个是标准未定义的。
int num = 10;
num>>-1;//error
4. 位操作符
& //按位与 (同1为1)
| //按位或 (有1为1)
^ //按位异或 (相同为0,相异为1)
注:他们的操作数必须是整数。
看下面代码:
int main()
{
int a = 3;
int b = -5;
int c = a & b;//& - 按(2进制)位与
printf("%d\n", c);//3
//
//00000000000000000000000000000011 - 3的补码
//10000000000000000000000000000101 -5的原码
//11111111111111111111111111111010 -5的反码
//11111111111111111111111111111011 -5的补码
//
//00000000000000000000000000000011
//11111111111111111111111111111011
//00000000000000000000000000000011 - 3
//
return 0;
}
int main()
{
int a = 3;
int b = -5;
int c = a | b;//& - 按(2进制)位或
printf("%d\n", c);//-5
//
//00000000000000000000000000000011 -> 3的补码
//10000000000000000000000000000101 -5的原码
//11111111111111111111111111111010 -5的反码
//11111111111111111111111111111011 -5的补码
//
//00000000000000000000000000000011
//11111111111111111111111111111011
//11111111111111111111111111111011
//11111111111111111111111111111010
//10000000000000000000000000000101 -> -5
return 0;
}
int main()
{
int a = 3;
int b = -5;
int c = a ^ b;//& - 按(2进制)位异或
printf("%d\n", c);
//异或的运算:相同为0,相异为1
//
//00000000000000000000000000000011 -> 3的补码
//10000000000000000000000000000101 -5的原码
//11111111111111111111111111111010 -5的反码
//11111111111111111111111111111011 -5的补码
//
//00000000000000000000000000000011
//11111111111111111111111111111011
//11111111111111111111111111111000
//11111111111111111111111111110111
//10000000000000000000000000001000
//-8
//
return 0;
}
4.1练习
1.不创建临时变量,实现两个整数的交换
方法1:
int main()
{
int a = 3;
int b = 5;
a = a + b;//如果a b都很大,那么a+b可能会超过int的取值范围,因此存在一定的缺陷
b = a - b;
a = a - b;
printf("a=%d b=%d\n", a, b);// 5 3
return 0;
}
方法2:
//方法2
int main()
{
int a = 3;
int b = 5;
a = a ^ b;
b = a ^ b;//b=a ^ b ^ b
a = a ^ b;//a^b^a
printf("a=%d b=%d\n", a, b);//5 3
return 0;
}
2.编写代码实现:求一个整数存储在内存中的二进制中1的个数。
//方法1
#include <stdio.h>
int main()
{
int num = 10;
int count = 0;//计数
while (num)
{
if (num % 2 == 1)
count++;
num = num / 2;
}
printf("二进制中1的个数 = %d\n", count);
return 0;
}
//方法2:
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
for (i = 0; i < 32; i++)
{
if (num & (1 << i))
count++;
}
printf("二进制中1的个数 = %d\n", count);
return 0;
}
//方法3:
#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;
}
5. 赋值操作符
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;//复合赋值
//其他运算符一样的道理。这样写更加简洁。