运算符
1 , 运算符分类
单目运算符
双目运算符
三目运算符
1,算术运算符
2,关系运算符
3,逻辑运算符
4,赋值运算符
5,位运算符
6,其他运算符
6,补充
2, 优先级:算法 (算的方式) 结合性:读法(读的方式)
= :赋值运算符:运算的时候自右往左
运算符的右边称为右值,左边称之为左值
优先级表从上往下
int num = 888 ;//把888赋值给num 读法
3,算术运算符
*:乘法(不能省略)
int result = 0 ;
int a = 1 , b = 2 ;
result = a + b * a * \a;
/:除法
除法符号两边都是整形的时候会自动取整
result = a / b ;
printf("result=%d\n",result);
哪怕定义double类型的函数也不行
double A = 1 / 2 ; // 0
printf("double=%lf\n",A);
想避免取整,要把 int 类型转换位 double 类型的函数
double A = 1/2 ;
printf("double=%lf",A);
求浮点型除法,要把分子或者分母变成小数,只要有一个是小数就可以
eg:1.0*1/4(这里面1.0是为了防止出现自动取整的情况)
%:取余运算符 --->模运算
printf("余数:%d\n",1%2);
正负号问题
余数的正负号只和被取余数有关
printf*("余数:%d\n"1%-2); //1
printf*("余数:%d\n"-1%-2); //-1
printf*("余数:%d\n"-1%2); //-1
小数没有取余的概念
除数不能为0
4.条件与逻辑运算符
条件运算符代表的是一种关系,条件表达式只有两个值,0(不成立),1(成立)1
特别地,
1,C语言中,非零值都代表成立的意思
2,NULL \0 0 都是不成立的意思
4.1条件运算符
>
<
>=
<=
!= 不等于
== 等于
printf("%d\n",1>2); // 输出结果为0
条件描述不存在连续操作
printf("%d\n",1<=6<=3);//1<=6<=3是恒等式
打印结果是1
先执行1<=6,输出结果1,1小于3,输出结果1
如果反过来,1>=6,输出结果0,0小于3,输出结果1
4.2逻辑运算符
&&逻辑与运算
printf("%d\n",x>=1&&x<=3&&x%2==0);
| | 逻辑或运算
printf("%d\n",x<=1||x%3==0||x>=5);
! 否定
printf("%d\n",! "nibuhao");
4.3短路现象
&& | | 运算都存在短路现象
int result = 0;
int a = 0;
//赋值表达式充当条件的时候,最终值是变量值
result = (1 >= 2 && (a = 3));
printf("result:%d\ta=%d\n", result, a);// result = 0 ;a = 0 ;
//下面不存在短路现象
result = ((a = 3)&& 1 >= 2);
printf("result:%d\ta=%d\n", result, a);//result = 0 ;a = 3 ;
//同理下面也存在短路现象
result = (1 <= 2 || (a = 888));
printf("result:%d\ta=%d\n", result, a);//result = 1 ;a = 0 ;
result = (1 <= 2 || a = 888);
//无括号时候,会报错
//为什么没有括号下面的的表达式报错
//1 <= 2 || a = 888;
//<=与||优先级是高于=
//先算1 <= 2 || a 算完是1
//1是不能被888赋值//为什么没有括号下面的的表达式报错
//1 <= 2 || a = 888;
//<=与||优先级是高于=
//先算1 <= 2 || a 算完是1
//1是不能被888赋值
表达式中多用()符号
5,位运算符
用途:1,数据加密解密 2,算法优化
/*
&:位与 全1出1,有0出0
|:位或 有1出1,全0出0
~:按位取反
>>:右移
<<:左移
^:异或
*/
&,位与运算 全1出1,有0出0
|,位或运算 有1出1,全0出0
~,按位取反,一个二进制操作数,对应位为0,结果位为1;对应位为1,结果位为0; (作用是将每位二进制取反)
^,异或运算 同出0,异出1
>>,右移,右边去掉几位,左边补充几位,正数补0,负数补1右移几位其实就是这个数除以2的几次幂 -----》除法
<<,左移,左边去掉几位,右边补充几位零在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。-----》乘法
6,复合运算符
/*
a/=b a=a/b
a+=b a=a+b
a*=b a=a*b
a|=b a=a|b
a&=b a=a&b
*/
int result = 0 , a = 1 , b = 2 ;
result *= a + b ; //复合赋值运算符,无论右边式子有没有括号,默认右边作为整体来解析
//result = (a + b)* result ;
7,特殊运算符
7.1 sizeof运算符
基本用法:统计类型占用字节数(在编译期间完成 )
printf("int的字节数:%d\n",sizeof(int));
printf("long int的字节数:%d\n",sizeof(long int));
printf("char的字节数:%d\n",sizeof(char));
//WIN64位系统下, 整形占位符用%zd
printf("int的字节数:%d\n",sizeof(int));
printf("long int的字节数:%d\n",sizeof(long int));
printf("char的字节数:%d\n",sizeof(char));
//也可以统计字符串
printf("char的字节数:%d\n",sizeof("ILOVEYOU"));
//sizeof在编译期间完成,下面的sizeof(num=8)赋值运算不会运行,在运行的时候就已经得到结果4了
int num = 0 ;
int result = sizeof ( num = 8 );//变量在代码运行的时候才会得到值,运行的时候sizeof就已经得到值4了,统计的是 int 占用的多少字节
printf("result=%d\tnum=%d\n",result,num);//得到的结果是 4
7.2 三目运算符
a?b:c
表达式a成立 表达式值就是b,a不成立,表达式的值就是c
一般用于求最值
printf("%d\n",1>2?1:2);//一大于2不成立,整个式子表达式就是2
int a = 0;
int b = 0;
scanf("%d%d",&a&b);
printf("max=%d\n",a>b?a:b);//得到最大值
printf("min=%d\n",a>b?b:a);//得到最小值
//三目运算符也可以嵌套
int c = 2 ;
int ab = a>b?a:b ;
int abc = ab>c?ab:c ;
//用ab的值替换abc中的ab
printf("max=%d\n",a>b?a:b>c?a>b?a:b:c);
7.3自增自减运算符
++ -- 运算符
int a = 0 ;
a++; //a = a + 1
a--; //a = a - 1
int b = 0 ;
b = ++a ;//前置 先改变自身再参与运算 b与a的值是一样的 a=1 b=1 a先自增,再赋值给b
b = a++ ;//后置 先做其他运算,再改变自身 a=2 b=1 a先赋值给b,再自增
7.4逗号运算符
优先度最低
printf("逗号表达式最终的值是最后的那个",(1,2,3,4,5,6,));//
a=1;
b=1;
result = (a +=1, b+=2, a = a + b ,a + b );//值为8,说明,运算的时候每一部分都进行了
int C = 0, int D = 0 ;//是错误的
8,数据类型的转换
隐式转换
赋值运算的隐式转换
printf("逗号表达式最终的值是最后的那个",(1,2,3,4,5,6,));//
a=1;
b=1;
result = (a +=1, b+=2, a = a + b ,a + b );//值为8,说明,运算的时候每一部分都进行了
int C = 0, int D = 0 ;//是错误的
ASCI I码转换
char b = 65;
int c = 'A'
printf("b=%d\tc=%c\n",b,c);
大小写字母之间数差是32 大写A(65)的码值+32=小写a的码值
27 ESC键 32空格
putchar('A'+32);//大小写转换
num = '1' - '0 '//数字字符转换为数字
强制转换
number = (int)1.233;
printf("%d\n",number);
double dnum = 1 / (double)2;//只要在分母或者分子位前加转换类型就可以了
printf("%lf\n",dnum);
小范围往大范围转,可以
大范围往小范围,会出现数据截断
打印时参数转换问题
打印函数printf函数参数转换会出现问题,保持数据类型和格式控制字符一致
printf("%d/n",int(1.333));//会出现数据丢失现象
printf("%lf\n",double(1);
9,共享内存
(仅限VS中)
int result = 0;
int a = 1 ;
result = a++ + a++ + ++a + ++a + a++;//只看前置 a=3 3*5 //result = 3*5 a = 6
printf("result:%d\ta=%d\n", result, a);
a = 2;
result = a++ * a++ * ++a * ++a * a++; //a=4 4*4*4*4*4
printf("result:%d\ta=%d\n", result, a);
a = 2;
result = a++ + a++ + ++a + ++a + a++ + --a+ --a;
printf("result:%d\ta=%d\n", result, a);
函数参数的入栈顺序是从左往右
int i = 0;
printf("%d%d%d%d\n", i++, i++, i++, i++);3 2 1 0
return 0;