目录
一、除法—"/"与取模—"%"
/ 是除法,%是取模。
5除以2商2余1。
分别表示 5/2=2(取商)
5%2=1(取余)
若需输出小数,使用浮点数定义
#include <stdio.h>
int main()
{
double i=5;
i=5/2.0;
printf("%lf",i);
return 0;
}
%d:整型输出,%ld长整型输出⭐
%o:以八进制数形式输出整数,打印的是无符号类型
%x:以十六进制数形式输出整数,%X以大写字母输出,打印的是无符号类型
%u:以十进制数输出unsigned型数据(无符号数)
%c:用来输出一个字符,如果是数字则是ASCII码值对应的字符⭐
%s:用来输出一个字符串⭐
%e以指数形式输出实数
%g:根据大小自动选f格式或e格式,且不输出无意义的零
%p:专门用来打印地址⭐
%hd:打印以十进制显示short类型的整数
%f:单精度浮点型,用来输出实数,以小数形式输出,对应float⭐
%lf:双精度浮点型,用来输出实数,以小数形式输出,对应double⭐
二、右移—">>"和左移—"<<"
右移操作符
1.算数右移
右边丢弃,左边补原符号位——正数补0,负数补1
2.逻辑右移
右边丢弃,左边补0。
#include<stdio.h>
int main()
{
int a=16;
int b=a>>1;//>> 右移操作符,移动的是二进制位
printf("%d",b);
return 0;
}
声明:一个int包含4个字节,32个比特位,作图时32个数字不太美观,此处省略
整数的二进制表示有:原码、反码、补码
储存到内存的是补码
例如-1
1000 0000 0000 0001 原码
1111 1111 1111 1110 反码,符号位不变, 其余取反
1111 1111 1111 1111 补码,反码加1
左移操作符:左边丢弃,右边补0
int main()
{
int a=5;
int b=a<<1;
printf("%d",b);
return 0;
}
效果实现:
左移n位乘2的n次方,右移n位除2的n次方,-1和1右移除外。
警告:不要向右或向左移动-1(负数位)
移位操作符只能用于整数。
三、位操作符
& 按位与
| 按位或
^ 按位异或
1、按位与"&"
看代码理解,按二进制位 与 或 异或
#include<stdio.h>
int main()
{
int a=3;
int b=5;
int c=a&b;
//a:0000 0000 0000 0000 0000 0000 0000 0011
//b:0000 0000 0000 0000 0000 0000 0000 0101
//c:0000 0000 0000 0000 0000 0000 0000 0001
//注意事项:竖列里,有一个0就是0,都为1才是1
//正数的原反补码相同,若为负数则需换成补码再操作
printf("%d",c);
return 0;
}
2、按位或"|"
#include<stdio.h>
int main()
{
int a=3;
int b=5;
int c=a|b;
//a:0000 0000 0000 0000 0000 0000 0000 0011
//b:0000 0000 0000 0000 0000 0000 0000 0101
//c:0000 0000 0000 0000 0000 0000 0000 0111
//注意事项:竖列里,有一个1就是1,都为0才是0
//正数的原反补码相同,若为负数则需换成补码再操作
printf("%d",c);
return 0;
}
3、按位异或"^"
#include<stdio.h>
int main()
{
int a=3;
int b=5;
int c=a^b;
//a:0000 0000 0000 0000 0000 0000 0000 0011
//b:0000 0000 0000 0000 0000 0000 0000 0101
//c:0000 0000 0000 0000 0000 0000 0000 0110
//注意事项:竖列里,相同为0,相异为1。
//正数的原反补码相同,若为负数则需换成补码再操作
printf("%d",c);
return 0;
}
1.按位异或练习:不使用第三个变量,交换a,b两个变量
#include<stdio.h>
int main()
{
int a=3;
int b=5;
/*int tmp=0;法一,但不符合题目要求
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("a=%d b=%d",a,b);
return 0;
}
a ∨ 011 ∧ (110) ∨ (110)
b ∨ 101 ∧ 101 ∨ 011
∨ (110) ∧ 011 ∨ 101
跟着箭头的方向读,括号()里的看做是中间值。第二列011又得出了a的值,我们人为赋给b,同理,第三列101得出了b的值,我们认为赋给a,这样就实现了ab交换。
2.按位与练习:统计二进制数字中有多少个1
#include<stdio.h>
int main()
{
/*int num=0;
int count=0;
scanf("%d",&num);//这个代码输入-1就会出问题
while(num)
{
if(num%2==1)
count++;
num=num/2;
}
printf("%d",count);*/
//下面我们使用按位与和移位操作符
int i=0;
int count=0;
int num=0;
printf("请输入要统计的十进制数:");
scanf("%d",&num);
for(i=0;i<32;i++)
{
if((num>>i)&1==1)
count++;
}
printf("%d", count);
return 0;
}
四、复合赋值操作符
a=a+1 可以写成 a+=1
a=a>>1 可以写成 a>>=1
类似还有+=、-=、*=、/=、%=、&=、|=、^=、>>=、<<=
五、单目操作符
单目运算符:
逻辑非运算符【!】
按位取反运算符【~】
自增自减运算符【++ --】
负号运算符【-】
类型转换运算符【(类型)】
指针运算符和取地址运算符【*和&】
长度运算符【sizeof】
1、非—"!"
#include<stdio.h>
int main()
{
int a=0;
if(!a)//a初始为0,表示假,!a在这里默认表示1,表示真
printf("Hello");
return 0;
}
2、取地址—"&"和解地址—"*"
#include<stdio.h>
int main()
{
int a=10;
int* p=&a;//取地址操作符
*p=20;//解引用操作符
return 0;
}
3、sizeof
#include<stdio.h>
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));//32位平台所占4个字节
printf("%d\n", sizeof(arr));//40
return 0;
}
4、按位取反—"~"
#include <stdio.h>//
int main()
{
int a=0;
//0000 0000 0000 0000 0000 0000 0000 0000
//1111 1111 1111 1111 1111 1111 1111 1111 补码
//1000 0000 0000 0000 0000 0000 0000 0001 原码
printf("%d",~a);//按(二进制位)位取反
return 0;
}
5、自增—"++"
#include<stdio.h>
int main()
{
int a=10;
printf("%d\n",++a);//前置a++,先a++,后使用
printf("%d\n",a++);//后置a++,先使用,后++
return 0;
}
6、强制类型转换—" ( ) "
#include<stdio.h>
int main()
{
int a=(int)3.14;//强制类型转换
printf("%d",a);
return 0;
}
六、逻辑操作符—"&&"和"||"
&& 逻辑与
|| 逻辑或
区分逻辑与(&&)和按位与(&) 逻辑或(‖)和按位或(|)
七、逗号表达式
用逗号隔开多个表达式,逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
#include<stdio.h>
int main()
{
int a=1;
int b=2;
int c=(a>b,a=b+10,b=a+1);
printf("%d",c);//13
return 0;
}
八、三目操作符——条件操作符
表达式一 ? 表达式二 : 表达式三
#include<stdio.h>
int main()
{
int a=0;
int b=0;
//if(a>5)
// b=6;
//else
// b=-6;
b=(a>5?6:-6);//一行搞定
printf("%d",b);
return 0;
}