算术操作符
+ - * / %
移位操作符
<< 左移操作符 左边抛弃、右边补0
>> 右移操作符 若为负数,左边补1,正数补0
不可以移动负数位 例如:
int num = 10;
num>>-1;//error
int main()
{
int a = 5;
int b = a << 1;
//左移操作符中
//a = 0000000000000000101
//a << 1 0000000000000001010 不改变a
int c = a >> 1;
//右移操作符中 右边丢弃 左边补0
return 0;
}
位操作符
& //按位与
| //按位或
^ //按位异或
他们的操作数必须是整数
此处 ^按位异或 与加减法的关系
例如,这段代码中,实现了没有临时变量的两个数交换,就是与加减法的关系
#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;
}
首先,先将a 与 b 转换为2进制类型
赋值操作符
= 、+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换——例如(int*)a;
其中需要注意的是 sizeof() 是一个操作符,而非函数。它可以求变量(类型)所占空间的大小。
sizeof(数组) ,那么求的是整个数组的大小
关系操作符与逻辑操作符
关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等逻辑操作符
&& 逻辑与
|| 逻辑或
条件操作符
exp1 ? exp2 : exp3
条件 ? 表达式1 : 表达式2
例如求a >= b ? a : b;
条件成立,执行表达式1,不成立则执行2.
逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
int main()
{
a = get_val();
count_val(a);
while (a > 0)
{
a = get_val();
count_val(a);
}//此处 上面两行代码冗余了。可以进行如下修改
while (a = get_val(), count_val(a), a > 0)
{
}
}
整形提升
c语言中,整形算术 至少 以缺省型类型的精度来进行。
为了获得精度,c语言中的字符和短整形等操作数,在使用前会先转换成 普通整形, 此过程称为整形提升。
为什么需要?
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令
中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转
换为int或unsigned int,然后才能送入CPU去执行运算。
//实例1
char a,b,c;
...
a = b + c;
此时, b和c 先进行整形提升,再相加,然后截断,赋值给a
//负数的整形提升
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
//正数的整形提升
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
//无符号整形提升,高位补0
算术转换
char a;
(int)a;//将char a 强制转换为 int a;
操作符的属性
1. 操作符的优先级
2. 操作符的结合性
3. 是否控制求值顺序。