操作符总结
算术操作符
+ - * / %
1.%只能用于整数与整数之间
2. / 根据两边的操作数的不同,而分为整数除法和浮点数除法
移位操作符
<< 左移操作符
>> 右移操作符
左移操作符
左边抛弃,右边补0
右移操作符
通常我们的编译器会使用算术移位
左边填充符号位,右边丢弃
1.整数在内存中存储的是二进制的补码
2.正数的原反补码是相同的
3.负数 原码->补码 取反 +1
补码->原码 取反+1 或 -1取反
4.==不能移动如(-1)之类的负数,即 a>>-1
位操作符
& 按位与
| 按位或
^ 按位异或
注意:操作数只能为整数
不创建临时变量实现两个数的交换
int a=20;
int b=10;
a=a^b;
b=a^b;
a=a^b;
//完成a b的交换
编写代码实现:求一个整数存储在内存中的二进制中1的个数
方法1
除以2得1时即count++
#include<stdio.h>
int main()
{
int num,count=0;
scanf("%d",&num);
while(num)
{
if(num%2==1)
count++;
num=num/2;
}
printf("count=%d",count);
return 0;
}
缺点:是只可以对正数运算
方法2
运用>>操作符,逐个判断是否为1
#include<stdio.h>
int main()
{
int i,num,count=0;
scanf("%d",&num);
for(i=0;i<32;i++)
{
if((num>>i)&1==1)
count++;
}
printf("count=%d",count);
return 0;
}
缺点:虽可以正负数进行转换,但效率低下
方法3
和小的数字按位与
#include<stdio.h>
int main()
{
int num,count=0;
scanf("%d",&num);
while(num)
{
num=num&(num-1);
count++;
}
printf("count=%d",count);
return 0;
}
缺点:效率高,但不容易想到
注:
1.a^0=a a^a=0
2.==c=a+(b-a)/2=(a&b)+((a^b)/2)
赋值操作符
单目操作符
~ 对一个数的二进制按位取反
前置++ 先++后使用
后置++ 先使用后++
注:1.a=10 ~a=-11
因为~取反包括符号位
2.sizeof (char)=1字节
sizeof(&char)=4字节
关系操作符
!= 测试不相等
==测试相等 (不能判断字符串是否相等)
逻辑操作符
&& || 只关注真假
区别于按位与按位或的需要看二进制
&&前边的一旦为假,后面的即不再运算
|| 前边的一旦为真,后面的即不再运算
条件操作符
exp1?exp2:exp3
逗号表达式
从左往右依次执行,但整个表达式的结果是最后一个表达式的结果
下标引用、函数调用和结构成员
1.[]下标引用操作符
操作数:一个数组名+一个索引值
arr[10]={1,2,3,4,5,6,7};
int* p=arr;
p[5]==*(p+5)==arr[5]==*(arr+5)==*(5+arr)==5[arr];
2.()函数调用操作符
接受一个或多个操作数,第一个操作数是函数名,其余是传递给函数的参数
3.访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名