目录
序言
本篇文章主要介绍C语言中不同类型的操作符,它们的功能,以及一些需要注意的小细节.
一.算术操作符
+ - * / %(取余)
算术操作符和我们平时进行数字运算时用的算术符号功能完全相同,这里不多赘述,只谈一些细节.
1.上述符号都是二元操作符,即针对的是两个操作数.一元只需要一个操作数比如+1,起到强调其为正数的作用.
2.除了%运算符外(需要用fmod函数),另外的操作符都可运用在整数,浮点数上,当int类型和float类型进行/运算时,运算结果将会是float类型的.
3.两个整数相除,答案将会舍弃小数部分输出,比如1/2,得到0.5,舍弃掉小数部分,实际上只会输出0.
4.当/和%运算符作用在负操作数上,结果将会变得无法确定,按照C89标准,-9/7可以取-1也可以取-2,但在C99标准时,将会向靠近0的部分进行取值,-9/7会得到-1.
二.移位操作符
1.左移操作符<<
(左边抛弃,右边补0) 从结果上看,相当于乘2的效果.像是194左移变成1940,相当于乘10.
2.右移操作符>>
2.算术右移(vs2019中采用的是算术右移)
左边用符号位填充,右边丢弃,保留正负性
也可以理解为符号位保持不变,同时用位移前符号位的数字来填充空位
注意:千万不要移动负数位!!!!!
三.位操作符
通过逻辑异或操作符^,我们就可以进行些好玩的操作,比如在不创建第三个变量的情况下,将变量a,b的值发生交换.(甚至无浪费更多空间)
同样我们还可以实现不使用+-*/符号,实现将两个数相加.
比如十进制的15和7相加,实际上是没有进位的12,与进位的10,两者相加得到的22.
二进制也可以进行同样的实现,a ^ b得到不进位的数字,(a & b)<<1 得到进位后的数字
当然为了避免在接下来异或操作中,依旧存在进位,我们要重复操作,直到(a & b)<<1 == 0停止.(意味没有进位)
Lg. a=0101(5) b = 0011(3)
第一次 0110(a ^ b) 0010 [(a&b)<<1]
第二次 0100(a ^ b) 0100 [(a&b)<<1]
第三次 0000(a ^ b) 1000 [(a&b)<<1]
第四次 1000(a ^ b) 0000(结束循环)
得到答案1000(8)代码如下:
int Add(int num1, int num2) {
// write code here
while (num2 != 0)
{
int tmp = num1 ^ num2;
num2 = (num1 & num2) << 1;
num1 = tmp;
}
return num1;
}
同样,逻辑与和逻辑或操作符也有很多有趣的操作,这里只举一个例子,比如统计一个数的二进制中有多少个1,和多少个0.
#include <stdio.h>
//统计二进制中1的个数
int Count_one_bit(int x)
{
int cnt = 0;
while (x)
{
x = x & (x - 1);
cnt++;
}
return cnt;
}
//统计二进制中0的个数
int Count_zero_bit(int x)
{
int cnt = 0;
while (x + 1)
{
cnt++;
x = x | (x + 1);
}
return cnt;
}
int main()
{
int x = 0;
scanf("%d", &x);
int num1 = Count_one_bit(x);
int num2 = Count_zero_bit(x);
printf("%d %d", num1, num2);
return 0;
}
四.赋值操作符
五.单目运算符
1.sizeof操作符
sizeof操作符可以求解类型名,对象,常量等的字节大小
数组名一般是数组首元素的地址 ,传参时,也是传的首元素的地址,我们可以用指针去接收它,但在sizeof(数组名)中,求的是整个数组的大小.
我们再看一段这段代码,a没有显示++,这是为什么呢?
一般表达式的运算是在运行时执行的,而sizeof是一个编译阶段就执行的运算符,在其内的任何运算都不执行. 所以a并没有++.
2.前置/后置++ --
3.!逻辑反操作
非0则变为0(真转成假);0则变为非0(假转成真)
补充:德摩根定律
对各条件取反,然后将逻辑或变为逻辑与(逻辑与变为逻辑或),再加上取反,两者是等价的.
比如x <= 3 && y >=6 <----------> !(x > 3 || y < 6)两者是等价的
其实也比较好理解,&&逻辑与在数学上和交集概念类似,||逻辑或在数学上和并集概念类似,!则是取补集.读者通过下面的图可以尝试自己加深理解.
六.关系操作符
七.逻辑操作符
a++为后置++,先使用,意味着a为0,0代表假,所以后面所有的条件都没判断,b,d的值都没有改变
可以猜想,当逻辑与换成逻辑或,a,b的值都会改变,而d的值不会改变,可以想一下为什么?
八.条件操作符(三目操作符)
实际上和if ...else ...相同功能,不过更加简便.
九.逗号表达式
十.下标引用、函数调用和结构成员
[ ] 下标引用操作符
数组访问下标,实际上是对指针进行移动,然后解引用访问相应的值