算术操作符
1.除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。
2.对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数值型的就是浮点除法。
3.%操作符的两个操作数必须为 整数。返回的是整除之后的余数。
#include<stdio.h>
int main(){int a=5/2;//商2余1printf("a=%d\n",a);return 0;
}
double a=5/2.0;//商2余1
printf("a=%lf\n",a);
移动操作符
<<左移操作符
>>右移操作符
右移操作符:
1.算数右移
右边丢弃,左边补原符号位
2.逻辑右移
右边丢弃,左边补0
int a=16;int b=a>>1;//右移操作符,右移是二进制位//10000//1.算数右移//2.逻辑右移printf("b=%d ",b);return 0;
int a=-1;
//整数2进制表示有:原码、反码、补码
//存储到内存中是补码
//10000000000000000000000001//原码
//11111111111111111111111110//反码
//11111111111111111111111111//补码
int b=a>>1;//右移操作符,右移是二进制位
//10000
//1.算数右移
//2.逻辑右移
printf("b=%d ",b);
return 0;
}
int main(){int a=5;int b=a<<1;printf("%d\n",b);return 0;}
左移,左边补零,右边丢弃
位操作符
& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数。
int main(){
//&-按2进制位与
int a=3;
int b=5;
int c=a&b;
//00000000000000000000000000000011
//00000000000000000000000000000101
//00000000000000000000000000000001
printf("%d\n",c);
return 0;
}
//按位或
int main(){int a=3;int b=5;int c=a|b;printf("%d\n",c);//00000011//00000101//00000111return 0;
}
//按位异或
int main(){
int a=3;
int b=5;
int c=a^b;
printf("%d\n",c);
//00000000000000011
//00000000000000101
//00000000000000110
return 0;
}
交换
int main(){
int a=3;
int b=5;
int tmp=0;
printf("before:a=%d b=%d\n",a,b);
tmp=a;
a=b;
b=tmp;
printf("after:a=%d b=%d\n",a,b);
return 0;
}
无中间变量交换
int main(){
int a=3;
int b=5;
//int tmp=0;
printf("before:a=%d b=%d\n",a,b);
// tmp=a;
// a=b;
// b=tmp;
//加减法-可能会溢出
// a=a+b;
// b=a-b;
// a=a-b;
//异或的方法
a=a^b;
b=a^b;
a=a^b;
printf("after:a=%d b=%d\n",a,b);
return 0;
}
011
101
110=6=a
110
101
011=3=b
110
011
101
a=5
int main(){int num=0;int count=0;scanf("%d",&num);//统计num的补码中有几个1while(num){if(num%2==1)count++;num=num/2;}printf("%d\n",count);return 0;
}
-1的话就犯错误了
改进
int i=0;int num=0;int count=0;
int main(){scanf("%d",&num);for(i=0;i<32;i++){if(1==((num>>i)&1))count++;}printf("%d\n",count);return 0;}
赋值操作符
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值,也就是你可以给自己重新赋值。
int main(){
int weight=120;
weight=89;
double salary=10000.0;
salary=20000.0;
赋值操作符可以连续使用,如如:
int a=10;
int x=0;
int y=20;
a=x=y+1;//连续赋值
这样的代码感觉怎么样?
那同样的语义,你看看:
x=y+1;
a=x;
这样的写法是不是更加清晰爽朗而且易于调试
return 0;
}
int main(){
int a=10;
a=a+2;
a+=2;
a=a>>1;
a>>=1;
a=a&1;
a&=1;
return 0;
}
符号:
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
单目操作符
单目操作符有哪些?
! 逻辑反操作
- 负值
+ 正直
& 取地址
sizeof 操作数的类型长度(以字节为长度)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
int main(){
int a=10;
// printf("%d\n",!a);
if(a){
printf("呵呵\n");
}
if(!a){
printf("hehe\n");
}
}
int main(){
int a=10;
int* p=&a;//取地址操作符
*p=20;//解引用操作符 a的值变为20
return 0;
}
int main(){
int a=10;
char c='r';
char *p=&c;
int arr[10]={0};
//sizeof 计算的变量所占空间大小,单位是字节
printf("%d\n",sizeof(a));//4
printf("%d\n",sizeof(c));//1
printf("%d\n",sizeof(p));//4
printf("%d\n",sizeof(arr));//40
return 0;
}
int main(){
int a=10;
char c='r';
char *p=&c;
int arr[10]={0};
//sizeof 计算的变量所占空间大小,单位是字节
printf("%d\n",sizeof(a));//4
printf("%d\n",sizeof(int));//4
printf("%d\n",sizeof(c));//1
printf("%d\n",sizeof(char));//4
printf("%d\n",sizeof(p));//4
printf("%d\n",sizeof(char));//4
printf("%d\n",sizeof(arr));//40
printf("%d\n",sizeof(int[10]));//4
return 0;
}