操作符详解
操作符详解
算术操作符
- +,-,*,/
- 除法(-):得到商,如果结果是小数,int类型只会打印整形,解决方法:
- 将商类型转化
- 直接将变量定义为double
- 余数(%):只用于整数
移位操作符
- >>和<<左移操作符
- 右移两种移法
- 算术右移:右边丢弃一位(存储的二进制),然后左边增加符号位(当前主要)
- 逻辑右移:右边丢弃,左边补0
- 例子:
1
2
3
4
5
6
7
8int a =16;
int b=a>>1;
printf("%d",b);
//结果是8(2^3)
//因为16的二进制是(32位)
//0(27位)10(4位)
//丢弃一位10(27位)10(3位)
//右移一位有除2二的效果 - 补充知识:
- 原码,反码,补码
- 整数的3码相同。负数的反码为:符号位不变,其他位按位取反。补码:负数的存储格式,为反码加1
- 左移:左边丢弃,右边补零
位操作符
- &(按位与),|按位与,
- &只要有0,则为0,两个1,才为
1
2
3
4
5
6
7int a=3;
int b=5;
int c=a&b;
//a在计算机中为00000000000000000000000000000011
//b在计算机中为00000000000000000000000000000101
//按位与: 00000000000000000000000000000001
//切记是补码进行按位与 - | 按位或:补码,有1则为1
- ^按位异或:2进制补码,相同为1,相异为0
- 实现两数的交换
- 倒水法(创建临时变量)
- 加减法(值大了,容易溢出)
- ^法(除了代码难读,没有缺点)
赋值操作符
- 连续赋值
1
x=y=z=1;
- 判断为==
- 复合操作符:
- +=,-=等等
单目操作符
- !:把假变成真,把真变成假
1
2
3
4
5
6
7
8
9
10//a为真打印
if(a)
{
printf("%d",a);
}
//a为假打印
if(!a)
{
printf("%d",a);
} - &(取地址):配合指针
1
2
3
4int a=10;
int* p=&a;
*p=20;//让a等于20
return 0; - sizoef:计算所占空间的大小,单位是字节,注意区分,strlen(数组的长度,不包括‘\0’);
- 指针大小,要不是4(32位系统)个字节,要不是8(64位字节)个字节
- 内部表的式不参加运算
1
2
3
4
5short s=0;
int a=10;
printf("%d",sizoef(s=a+5));
printf("%d",s);
//结果为2和0,因为不参与运算
- ~(按位(二进制)取反):将二进制按位取反,所有位按位取反
- ++a:先++,后使用
- a++:先使用,再++
1
2
3int a=0;
printf("%d",a++);
//结果位0; - (类型):强制类型转换
逻辑操作符
- &&(逻辑与)并且;
1
2
3
4
5int a=10;
int b=20;
int c=a&&b;
printf("%d",c);
//结果为1,因为a,b都为真1
2
3
4
5int i=0,a=0,b=2,c=3,d=4;
i=a++ && ++b && d++;
printf("%d,%d,%d,%d",a,b,c,d);
//结果为i=0,a=1,b=2,c=3,d=4;
//因为先使用a,a=0,为假,后面不计算 - &&,||:对于&&来说只要前面是假,后面不算,对于||来说只要前面是真,就不算
条件操作符
exp1?exp2:exp3:如果表达式一位真,则表达式二计算,且为整个表达式的结果,反之是表达式3
,(逗号表达式):简便代码
下标引用操作符
- []:常用于数组
函数调用操作符
- ():用于函数
访问一个结构的成员
struct: 创建一个结构体
.成员名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include<stdio.h>
//相当于盖房子时的规划图,name,age,id为成员
strcut stu
{
char name[10];
int age;
char id[20]
};//注意分号
int main()
{
strcut stu s1={"chg",20,"2022124032"};//往规划图里面加东西
struct stu* ps=&s1;//得到s1的地址
printf("%s",si.name);//1
printf("%d",s1.age);//2.查找成员
printf("%d",si.id);//3
printf("%s",(*ps).name);//与1相同
printf("%s",ps->name);//与1相同
return 0;
}
表达式的求和顺序
由操作的优先级和结合性决定
隐式类型转换:
整型提升:C的整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include<stdio.h>
int main()
{
char a=3;
//char 占1个字节,一共8个字符
//a=00000011
char b=127;
//b=01111111
char c=a+b;//相加转换为整形
//a=00000000000000000000000000000011
//b=00000000000000000000000001111111
//c=11111111111111111111111110000010
//根据符号数补齐
printf("%d",c);
return 0;
}算术运算:将低精度的转换为高精度的
操作符的属性
- 优先级:优先级高的先算
- 结合性:
- 求值顺序:
操作符详解
https://tsy244.github.io/2023/04/20/C/操作符详解1/