操作符:
算术操作符
+ - * / %
1:除了%操作符之外,其他几个操作符可以作用于整数和浮点数。
2:对于/操作符,如果两个操作数都为整数,执行整数除法,而只要有浮点数,执行的就是浮点除法。
3:%操作符的两个操作数必须为整数,返回的是整除之后的余数。
int a = 5/2;
printf("%d\n", a);
double b = 5 / 2.0;
printf("%f\n", b);
2
2.500000
a进行的是两个整数相除,因此并不会的到小数,要想得到小数,只需要把除数或者被除数改为浮点数即可。
移位操作符
移位操作符(移动的是二进制位,他们的操作数必须是整数),(右移一位有除二的效果):
右移操作符>>:
1:算数右移(主要针对负数符号位这里会有所不同):二进制最右边丢弃,左边补原符号位
2:逻辑右移(不分正负数):右边丢弃,左边补零
左移操作符<<:
左边丢弃,右边补0
对于移位运算符,不要移动负数位,这个是标准未定义的。
例如:
Int num=10;
Num>>-1;//error
8位二进制数11001101分别右移一位
逻辑右移就是:[0]1100110
算术右移就是:[1]1100110
整数存储到内存的是补码:
1000000000000000000000000000000000001(-1的原码)
1111111111111111111111111111111111110(反码,符号位不变,其余位置将0变成1)
1111111111111111111111111111111111111(补码,末位置加1)
位操作符:
(他们的操作数必须是整数,同样是对二进制进行操作)
1:& 按位与 :两个数的二进制位同时为1,则该位是1,否则是0,如果有负数进行参与,则应先算出该负数的补码,整数并不参加此次运算,由于正数的补码反码原码是相同的;
2: |按位或 :两个数的二进制只要有一个为一,则该位为1
3:^按位异或(两个数的二进制位,相同为0,相异为1)
例题:不创建临时变量实现两个数的交换
方法一:(但这种方法只能用于比较小的整数值,如果想实现非常大的整数进行交换,就可能会溢出,因此这种方法并不具有普遍性)
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
a = a + b;
b = a - b;
a = a - b;
printf("a=%d,b=%d\n", a, b);
return 0;
}
方法二:(这种方法并不会产生溢出现象,但是它的可读性和执行能力较差)
#include<stdio.h>
int main()
{
int a = 3, b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
判断一个数的二进制中包含几个1:
#include<stdio.h>
int main()
{
int num = 0;
int count = 0;
scanf_s("%d", &num);
while (num)
{
if (num % 2 == 1)
count++;
num = num / 2;
}
printf("%d\n", count);
return 0;
}
-1
0
但这个代码是有问题的,如果我们输入的数字是复数的话,得到的值是0,显然不符合我们的规则。
按位与的方法:
#include<stdio.h>
int main()
{
int num = 0;
int count = 0;
scanf_s("%d", &num);
int i = 0;
for (i = 0; i < 32; i++)
{
if (1 == ((num >> i) & 1))#不停的向右移动,1的二进制码始终是000000000000000000000001
count++;
}
printf("%d\n", count);
return 0;
}
-1
32
赋值操作符:
当我们不满意前面的某个变量时,可通过赋值运算符对该变量的值进行修改。
单个赋值:
举例:
int a = 100;
a = 30;
printf("%d", a);
30
连续赋值:
int a = 10, b = 23, x, y;
y = x = a + b;
printf("%d\n", y);
printf("%d\n", x);
33
33
小tips:赋值运算符是一个等号,而比较运算符是两个等号。
复合赋值符:
+= -= *= /= %= >>= <<= &= |= ^=
这种操作符在一定程度上可以简化代码量
举例:
a=a+2;
a+=2;
a=a>>1;
a>>=1;
这两种赋值的结果都是相通的,只是在形式上不太一样。
单目操作符:
!:逻辑反操作 (真变假,假变真)
-:负值
+:正值
& :取地址 (一般和指针配合使用)
sizeof :操作数的类型长度 (计算变量所占内存空间的大小,单位是字节)
sizeof(变量类型或变量名),后面如果是变量类型则括号不能省略,但如果是变量名括号可以省略。
~:对一个数的二进制按位取反
– :前置,后置–
++ :前置,后置++
*:间接访问操作符(解引用操作符)
(类型):强制类型转换
常见类型的字节大小:int:4个字节 char:1个字节 *p:4个字节 数组:数组元素个数×对应类型的大小
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81569.html