1.算数操作符 + - * / %
- a+b 含有两个操作数,+为双目操作符
- %操作符的两个操作数必须为整数。
- 除了%之外,整数和浮点数都可以做+ - * / 运算。
- 对于/操作符,只要两个操作数中有一个数是浮点型,执行的就是浮点数操作。
2.移位操作符 << 左移 >>右移
<< 左移操作符用法 :左移一位直接丢弃,右边补0
#include<stdio.h>
int main()
{
int a = 10;
int b = 0;
b = a << 1;//a向左移动一位,移得是整数的二进制位
printf("%d\n", a);
printf("%d\n", b);
getchar();
return 0;
}
- 结果:a=10;b=20 分析:数字在内存里存放的是二进制为的补码,a=10,补码为00000000000000000000000000001010 ,将a的32位二进制数向左移一位,在右边末尾补0,变成00000000000000000000000000010100,换算为十进制为20,赋给b。 注意:<<左移操作不能用于浮点数。 左移一位乘2的效果 。
>>右移操作符分为两种:算数右移 : 右边丢弃,左边补符号位(正数高位补0,负数高位补1)
逻辑右移: 右边丢弃,左边补0(不常用)
#include<stdio.h>
int main()
{
int a = -1;
int b = 0;
b = a >> 1;//a向右移动一位
printf("%d\n", a);
printf("%d\n", b);
getchar();
return 0;
}
- 结果:a=-1;b=-1 分析:-1的补码为11111111111111111111111111111111,右移一位并丢弃,左边高位补1,仍为32个1,结果为-1。
- 注意:在不同的编译器下结果可能不同,在这里就不一一说明了。
3.位操作符 & | ^
#include<stdio.h>
int main()
{
int num1 = 1;
int num2 = 2;
int a = 0;
int b = 0;
int c = 0;
a = num1 & num2;
b = num1 | num2;
c = num1 ^ num2;
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
getchar();
return 0;
}
- 结果为:0;3;3 分析:& | ^ 都是对整数的二进制补码进行运算,&:1&0=0,1&1=1;0&0=0. |:1 | 0=1,1 | 1=1,0 | 0=0;^相同位0,相异位1.
- 注意:任何数字和1&得到的结果为1,a^a=0,a^0=a.
4.复合赋值符 += -= *= /= %= >>= <<= &= |= ^=
a+=10等同于a=a+10,其他复合赋值符与+=用法相同。
5.单目操作符
- !:flag为真,!flag为假
- - :负值
- + :正值
- & :取地址
int a=10;
printf("%d\n",&a)//打印a的地址
- sizeof :取操作数的类型长度
sizeof(arr)/sizeof(arr[0]) //计算数组的长度
sizeof(short)//2 求变量类型所占空间的大小
sizeof内部表达式不参与运算
- ~ :对一个数的二进制位按位取反
~0结果为-1 ~(-1)结果为0
- -- :前置、后置--
b=a--//a先进行运算,a再减1
- ++ :前置、后置++
用法同--
- * :解引用操作
int *p=&a;
*p=0;//a=0
- (类型):强制类型转换
int a=(int)3.14//把3.14强制转换为整型
6.关系操作符
> >= < <= != ==
7.逻辑操作符 && ||
&&逻辑与:两个同时为真则为真 eg:i=0&&3&&4=0,当有一个数为假时,则后面无需进行运算结果直接为假
|| 逻辑或 :两个同时为假则为假
8.条件操作符
exp1? exp2 : exp3 如果exp1成立,exp2的结果为整个表达式的结果
如果exp1不成立,exp2的结果为整个表达式的结果