【C语言】——操作符

目录

1. 操作符分类

2. 算术操作符

3. 移位操作符

3.1 左移操作符

3.2 右移操作符

4. 位操作符

4.1练习

5. 赋值操作符

6. 单目操作符

6.1 单目操作符介绍

7. 关系操作符

8. 逻辑操作符

9. 条件操作符

10. 逗号表达式

11. 下标引用、函数调用和结构成员

1. [ ] 下标引用操作符

2. ( ) 函数调用操作符

3. 访问一个结构的成员

12. 表达式求值

12.1 隐式类型转换(整型提升和截断)

12.2 算术转换

12.3 操作符的属性

12.4一些问题表达式的分析


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;//复合赋值
//其他运算符一样的道理。这样写更加简洁。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

待己以诚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值