系统学习之C复习(5)操作位

算术操作符

+ - * / %

移位操作符

<< 左移操作符        左边抛弃、右边补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. 是否控制求值顺序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值