操作符详解
操作符详解
算术操作符
- +,-,*,/
- 除法(-):得到商,如果结果是小数,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/