- 算数操作符
+、-、*、/、% 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 //总结:一定要确定唯一的代码路径