一、操作符的分类
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
二、算术操作符
算术操作符就是进行加减乘除计算时所用的符号
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来更改
附录:操作符的优先级表