运算符和表达式

运算符

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值