C语言操作符是构成C语言表达式的工具,是说明特别操作的符号。
操作符的类型
算术操作符
+ - * / %
除了%操作符之外,其他均可以作用于整数和浮点数。
对于/操作符,如果是整数,执行整数除法,如果是浮点数,则执行浮点数除法
%操作符的两个操作符必须是整数,返回的是整除之后的余数。
移位操作符
<<左移操作符 >>右移操作符
左移位规则:左边抛弃,右边补0
右移位规则:这又分为两种,分别是逻辑移位和算术移位
逻辑移位 是左边用0填充,右边丢弃
算术移位 是左边用原该值的符号位填充,右边丢弃
例如:求一个整数存储在内存中的二进制中1的个数
#include<stdio.h>
void erjinzhi(int num){
int count = 0;
while (num){
if (num % 2 == 1)
count++;
num = num / 2;
}
printf("二进制中1的个数 = %d ", count);
return 0;
}
从这个程序里中,我们就可以测出,每个数在二进制中1的个数。但是我们,如果输入负数,我们会发现,我们的程序,是有问题的。如果输入了-10,那么-10之前的所有0都要取反,这个时候我们将出来许多的1。
所以我们进行一个改正
#include<stdio>
void erjingzhi(int num){
int i = 0;
int count = 0;
for (i = 0; i < 32; i++){
if (((num >> i) & 1) == 1)
count++;
}
printf("二进制中1的个数 = %d\n", count);
}
我们利用移位的方法去一个一个来计算。
这里添加一个二进制负数的转化过程,可以更好的理解。
Ps:注意我们的移位不要移动负数位,这个是标准未定义的。
位操作符
位操作符有三种分别是:按位与,按位或,按位异或
& | ^
它们的操作数必须是整数。
按位与:对两个数进行操作,然后返回一个新的数,这个数的每个位都需要两个输入数的同一位都为1时才为1.
按位或:比较两个数,然后返回一个新的数,这个数的每一位设置1的条件是两个输入数的同一位都不为0。即任意一个为1,或者都为1。否则为0。
按位异或:比较两个数,然后返回一个数,这个数的每个位设为1的条件是两个输入数的同一位不同,如果相同就设为0。即相同为0,不同为1。
赋值操作符
赋值操作符是一个很好用的操作符,你可以将你的变量设置成你需要的值。用 “=” 即可。
复合赋值操作符
+= | 加等 |
---|---|
-= | 减等 |
*= | 乘等 |
/= | 除等 |
%= | 取模等 |
>>= | 右移位等于 |
<<= | 左移位等于 |
&= | 按位与等于 |
|= | 按位或等于 |
^= | 按位取反等于 |
单目操作符
! | 逻辑反操作 |
---|---|
- | 取负数 |
+ | 取正数 |
& | 取地址 |
sizeof | 操作数的类型长度 |
~ | 对一个数的二进制按位取反 |
– | 减减,类似累减 |
++ | 加加,类似累加 |
* | 间接访问操作符 |
逻辑操作符
逻辑操作符有
&& 逻辑与
|| 逻辑或
它们与按位与和按位或之间的区别
1&2 ----->0
1&&2 ------->1
1|2 ------>3
1||2 ----->1
逻辑与还有逻辑或,此时是判断它的真假性。要记住,非0为真。这是一个关键。
#include<stdio.h>
int main(){
int i= 0,a=0,b=2,c=3,d=4;
i= a++&&++b&&d++;
printf("a= %d\n b=%d\n c=%d\n d=%d\n",a,b,c,d);
return 0;
}
输出后,abcd分别位1234。根据我们的猜测,这里可能是为135这样。但是这里有个坑。
这里存在一个短路求值的知识点。a=0这就代表了假。那么 a+±----->0。也就是说在这里是先返回,后++
短路求值:如果是&&左侧表达式为假的时候,右侧表达式不会求值
如果是||左侧表达式为真的时候,右侧表达式不会求值
条件操作符
exp1 ? exp2 : exp3
这是C语言中唯一的一个二目运算符,运算级非常低。
逗号表达式
exp1,exp2,exp3....expN
就是用逗号隔开的多个表达式。从左向右依次执行。
表达式求值
隐式类型转换
C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转化为普通类型,这种转换称为——整形提升。
char a,b,c;
...
a = b + c;
b和c的值被提升为普通整型,然后再执行加法运算。
加法运算完成之后,结果将被截断,然后再存储于a中。
算法运算中,a隐式转换为int。
凡是针对char/short,此时都隐式转换成int。
操作符的属性
复杂表达式的求值有三个影响的因素:
1.操作符的优先级
2.操作符的结合性
3.是否控制求值的顺序
以上就是操作符的基本了,目前是我能知道并且掌握的,当以后有了其他的之后,再慢慢的添加进去。