- 算数操作符
+、-、*、/、%
double a=5.0/2;(除数和被除数至少一个为小数,double类型保留小数点后6位)
double a=5.0%2;(取模除数和被除数不能为小数)
- 移位操作符
>>、<<
num<<;左移操作符
方法:左边丢弃,右边补0
num>>;右移操作符
方法:1算数右移:根据符号位来补,负数补1,正数补0(一般计算机使用)
2逻辑右移:右边丢弃,左边补0
//一般不能移动负数位,这是标准未定义的-num>>-1;error、
//三码之间的转换:原码
反码:原码符号位不变,其它位按位取反
补码:反码符号位不变,最后一位+1(逢2进1)-计算机内存存储的
- 位操作符
&、|、^
&(按位与):011和101(一个0则为0,同为1才为1)结果是001
应用:
int a = 15;
a = a&(~(1<<2));
printf("%d\n",a); //结果是11
//00000000000000000000000000001111//把倒数第三位改为0
//11111111111111111111111111111011//由下面的序列按位取反得到
//00000000000000000000000000000100//由1<<2;可以得到
//00000000000000000000000000001011
|(按位或):011和101(一个1则为1,同为0才为0)结果是111
应用:
int a = 11;
a = a|(1<<2);
printf("%d\n",a);//结果是15
//00000000000000000000000000001011//把倒数第三位改成1
//00000000000000000000000000000100//1<<2;可以得到
//00000000000000000000000000001111
^(按位异或):011和101(相同为0,相异为1)结果是110
//位操作符只用于整型,不用于浮点型
- 赋值操作符
=(赋值) 、 ==(判断相不相等)
- 复合赋值符
+=、-+、*=、/=、&=、>>=……等
- 单目和双目操作符
!a;-这里的!就是单目操作符,只有一个操作数(一般用于if语句中)
a + b;-这里的+就是双目操作符,有两个操作数
下面是单目操作符
- 操作数的类型长度-sizeof()的用法
//用来计算变量类型所占空间的大小,单位是字节
int a = 0;
char b = 'w';
char*p = &a;
int arr[10] = {0};//数组传参穿送的是第一个元素的地址,要使用指针接收
printf("%d\n",sizeof(a)); //结果是4,求变量时可以把括号省略掉,类型不行
printf("%d\n",sizeof(int)); //结果是4
printf("%d\n",sizeof(b)); //结果是1
printf("%d\n",sizeof(char));//结果是1
printf("%d\n",sizeof(arr)); //结果是40
printf("%d\n",sizeof(int [10])); //结果是40
printf("%d\n",sizeof(p));//结果是4或者8
printf("%d\n",sizeof(char*));结果是4或者8,数组传参时,大小是指针类型大小
short s = 0;
int a = 10;
printf("%d\n",sizeof(s = a + 5)); //结果是2-看short类型所占字节
printf("%d\n",s); //结果是0
- 按位取反操作符
~(按二进制位取反)-一般和&|^、<<和>>搭配使用
int a = 0;
printf("%d\n",a);结果是0
//00000000000000000000000000000000
printf("%d\n",~a);结果是-1(别记混:打印的是该数字的原码)
//11111111111111111111111111111111-按位取反之后的结果-补码
//11111111111111111111111111111110-减去1-反码
//10000000000000000000000000000001-原码
- 前置和后置操作符
++、--
前置++:先++后使用
int a = 10;
printf("%d\n",++a);//结果是11,先+1,再打印
后置++:先使用后++
int a = 10
printf("%d\n",a++);//结果是10,然后再+1
//--是一样的效果
取地址和间接访问操作符
&、*
取出一个地址放在指针变量里面去//-char*pa = &a;
强制类型转换
int a = 3.14;(不能直接转换)
int a = int (3.14);error
int a = (int)3.14;//强制类型转换格式
关系操作符
>=、<=、>、<、!=、==
注意:==和=书写时注意别写混淆
逻辑操作符
&&、||
&&(逻辑与):1&2和1&&2--结果依次为:0和1
001和010(左边只要有一个为假-0,右边就不算了)
||(逻辑或):1|2和1||2--结果依次为:3和1(左边只要为真-1,右边就不用算了)
应用:
int i = 0,a = 0,b = 2,c = 3,d = 4;
i = a++ && ++b && d++;(a为0,&&后面所有的都是0,就不用算了)
打印a,b,c,d:依次是1 2 3 4
int i = 0,a = 1,b = 2,c = 3,d = 4;(两个数都是非零,&&之后结果就为真是1)
i = a++ && ++b && d++;
打印a,b,c,d:依次是:2 3 3 5
int i = 0,a = 1,b = 2,c = 3,d = 4;
i = a++ || ++b || d++;(只要前面第一个为真,不管后面是真是假,后面的都不用算了)
打印a,b,c,d:依次是:2 2 3 4
条件操作符(三目操作符)
exp1?exp2:exp3
Max = (a>b ? a :b); //a如果大于b的话,Max = a;如果不大于,Max = b;
逗号表达式
exp1,exp2,exp3,……expN(从左向右一次执行,整个表达式的结果是最后一个表达式的结果)
int a = 1;
int b = 2;
int c = (a>b,a=b+10,a,b=a+1); //打印出c的结果是13
if(a=b+1,c=a/2,d>0) //表示的是如果d>0就为真,开始执行if语句了,前面的两个表达式也要参与计算
//尽量少使用逗号表达式
下标引用、函数调用和结构成员操作符
下标引用操作符:[]-下标引用操作符,操作数是数组名+下标值-a[4]
函数调用操作符:int max = get_max(a,b);-()就是函数调用操作符,操作数是get_max(函数名)+a+b
访问一个结构的成员:.(左边是结构体变量,右边是成员名)、->(左边是一个结构体指针,右边是一个成员名)
//描述一个学生-创建的一个结构体类型-struct stu{学生信息};
//使用结构体类型在主函数中创建了学生对象s1,并初始化
//struct stu s1 = {成员1,成员2,成员3}; ---s1是结构体变量
//打印一下:printf("%s\n",s1.成员1);---后面两个依次成员2,3
//struct stu *ps = &s1;
//printf("%s\n",(*ps).成员1);---后面两个依次成员2,3
//printf("%s\n",ps->成员1);---后面两个依次成员2,3
隐式类型转换
char a = 1,b = 2,c = 3;
//由于a里面只能存储8个比特位,则会发生截断,取32个比特位最后面的8位
整型提升:为了获得精度,表达式中的字符和短整型操作数在使用之前被转换为普通类型
如何提升:按照变量的数据类型的符号位来提升的(是0就补0,是1就补1)
a = b + c; //加完过后还要放在char类型中,则会发生截断
printf("%d\n",a); //还要进行整型提升,还要根据a补码来求原码
char c = 1;
printf("%u\n",sizeof(c));--结果是1
printf("%u\n",sizeof(+c));--结果是4,因为发生了整型提升
算数转换
long double、double、float、unsigned long int、long int、unsigned int、int(所占空间由大-小)
程序中上面任意两个变量进行运算,会现把小的类型转换为大的类型(比如:int和float,现将int类型转换为float类型)
操作符的属性
操作符的优先级(基本遵从数学算式里面的优先级)
操作符的结合性(满足优先级,再从左往右结合)
是否控制求值顺序(逻辑与&&、逻辑或||、条件操作符?:、逗号表达式也具有这个特点)
例如:a*b + c*d + e*f---有问题的表达式
c+ --c;--优先级高于+,但也存在问题,先算+(c = 1)结果是1,先算--(c = 1)结果是0
//总结:一定要确定唯一的代码路径