0
点赞
收藏
分享

微信扫一扫

冰冰学习笔记:操作符详解

才德的女子 2022-02-18 阅读 102

一、操作符的分类

算术操作符

移位操作符

位操作符

赋值操作符

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号表达式

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

二、算术操作符

算术操作符就是进行加减乘除计算时所用的符号

2.1 加:"+"

进行加法运算,可用于浮点数和整数

 

2.2 减:"-"

进行减法运算,可用于浮点数和整数

 

2.3 乘:" * "

进行乘法运算,可用于浮点数和整数

 

2.4 除:"/"

进行除法运算,应用于整数时应用的是整数除法得到的是商

应用于浮点数时应用的是浮点数除法,符号两边至少有一边写成浮点数

 

2.5 取模:"%"

只能应用于整数,求整除之后的余数

三、移位操作符

移位操作符分为左移操作符和右移操作符,移动的是二进制位。

进行移位操作时不会改变变量自身,和算术操作符类似。

整数的二进制表示有三种

原码,反码,补码

存储在计算机内存中的为补码

正整数的原码,反码,补码相同

负整数的原码,反码,补码不同,需要经过变化得到

例如:

// a=-5
//原码:10000000000000000000000000000101
//反码:11111111111111111111111111111010   符号位不变,其他位取反
//补码:11111111111111111111111111111011   反码+1

3.1左移操作符"<<"

规则:左边丢弃,右边补零

进行一次左移有乘2的效果

负数的变化:取-3为例

 

 

3.2右移操作符">>"

右移操作符有两种变换方法

1、算术右移:右边丢弃,左边补原符号位

2、逻辑右移:右边丢弃,左边补0

至于使用时究竟是哪一种取决于编译器

进行一次右移有除2的效果但是并不是一直成立

 

注意:不要移动负数位,这是标准未定义的

四、位操作符

 位操作符包含3种,与,或,异或,操作数必须是整数。并且位操作符属于双目操作符

4.1 按位与"&"

规则:有0为0,同1为1

 

 

4.2 按位或 "|"

规则:有1为1,同0为0

 

 

4.3 按位异或 "^"

规则:相同为0,相异为1

 

 异或的特殊情况:

a^a=0;

a^0=a;

练习题:

1、给定一个数组,数组元素中只有一个元素出现一次,找到这个元素

由于相同的两个数异或得到的是0;0与任何数异或得到的都是这个数本身

因此只需要将所有元素异或在一起就可以

int main()
{
	//1、给定一个数组,数组元素中只有一个元素出现一次,找到这个元素
	int arr[9] = {1,2,3,4,5,4,3,2,1};
	int i = 0;
	int ret = 0;
	int len = sizeof(arr) / sizeof(arr[0]);
	for (i = 0;i < len;i++)//将数组中的所有数异或在一起,得到的就是孤立的那个元素
	{
		ret = ret ^ arr[i];
	}
	printf("%d\n", ret);

	return 0;
}

2、不能创建临时变量,实现两个数的交换

交换两个数的值,我们最熟悉的就是运用临时变量来实现

int main()
{
	int a = 5;
	int b = 3;
	printf("交换前:a=%d,b=%d\n", a, b);
	int tmp = a;
	a = b;
	b = tmp;
	printf("交换后:a=%d,b=%d\n", a, b);
	return 0;
}

但是此时不符合题目要求,因为我们创建了第三个变量

不创建变量法:

(1):利用加减法

int main()
{
	int a = 5;
	int b = 3;
	printf("交换前:a=%d,b=%d\n", a, b);
	a = a + b;//a中存放的为a,b的和
	b = a - b;//用和减去b得到a的值赋予b
	a = a - b;//用和减去b(此时b中存放的为a的值)的到b的值
	printf("交换后:a=%d,b=%d\n", a, b);
	return 0;
}

但此方法存在弊端,如果a,b为非常大的数,两者相加得到的数值超过了整形的存储范围,那么得到的结果将不再成立。

(2):利用异或

//不创建变量,异或
int main()
{
	int a = 5;
	int b = 3;
	printf("交换前:a=%d,b=%d\n", a, b);
	a = a ^ b;//
	b = a ^ b;//b=a^b^b-->b^b=0,a^0=a,所以b中存放的是a的值
	a = a ^ b;//由于b中存放的为a的值,所以a=a^b^a=b
	printf("交换后:a=%d,b=%d\n", a, b);
	return 0;
}

 

 3、编写代码实现:求一个整数存储在内存中的二进制中1的个数

int main()
{
	int num = 0;
	while (scanf("%d", &num) != EOF)
	{
		int i = 0;
		int count = 0;
		for (i = 0;i < 32;i++)
		{
			if (1 == ((num >> i)&1))
			{
				count++;
			}
		}
		printf("%d\n", count);

	}
	return 0;
}

五、赋值操作符''=''

赋值操作符就是将一个变量赋予其特定的含义,切记,常量不能赋值

不能写成3=5,这不能实现。

复合赋值符:

1 加等"+="

2 减等"-="

3 乘等"*="

4 除等"/="

5 取模等"%="

6 右移等">>="

7 左移等"<<="

8 与等"&="

9  或等"|="

10 异或等"^="

六、单目操作符

 6.1单目操作符的介绍

1. 逻辑反操作"!"

 2. 正号与负号"+" "-"

表示正数和负数

3.取地址"&"

取出a的地址放到p中,p为指针变量

4.间接访问操作符(解引用操作符)" * "

对存放地址的指针通过解引用操作符来找到变量,对其进行操作

 

 5.操作数的类型长度"sizeof"

sizeof并非函数,而是操作符,计算类型创建的变量所占的内存大小,单位是字节

内部的表达式不参与计算,其括号可以进行省略

当sizeof(arr)arr表示数组名时,计算的是整个数组的大小

 6.对一个数的二进制位进行按位取反 "~"

 

多组输入时可用到

7."++"和"--"

均分为前置和后置

前置为先变化再用

后置为先用在变化

8.强制类型转换"()"

将a强制转换成short型 

七、关系操作符

关系操作符包含

大于">"   大于等于">="   

小于"<"   小于等于"<="

不等于"!="   

等于"=="  用来测试“相等”与赋值符号"="进行区分

注意:

两个字符串不能用"=="测试是否相等

如果使用比较的是首字符地址,地址肯定不相同

字符串比较用strcpy函数进行对比,比较的是对应字符的大小,并非字符串长度。

八、逻辑操作符

逻辑操作符有逻辑与和逻辑或

8.1逻辑与 "&&"

规则:全真为真,有假即假

当第一个条件为假时,后面的条件就不再进行判断或者运算。

8.2逻辑或"||"

规则:有真为真,全假为假

当第一个条件为真时,后面条件不在进行判断和计算

 九、条件操作符"exp1 ? exp2 : exp3 "

例如

a>b?a:b

表达含义为a大于b吗?如果大于则返回a,否则返回b

十、逗号表达式"exp1, exp2, exp3, …expN"

逗号表达式就是用逗号隔开的多个式子,从左到右依次进行执行,整个表达式的结果为最后一个式子的结果。

 十一、下标引用、函数调用和结构成员

11.1下标引用操作符 "[  ]"

有两个操作数,一个为数组名,一个为索引值

两个操作数是可以进行更换的 

arr[2]==[2]arr

11.2函数调用操作符"( )"

 接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数

至少为一个操作数,即函数名。

 max,a,b为操作数

11.3访问结构体成员操作符

" . " 点操作符   结构体.成员名

" -> "箭头操作符   结构体指针->成员名

 当更改结构体字符串内容时,要使用strcpy来更改

 

附录:操作符的优先级表

 

举报

相关推荐

0 条评论