运算符和表达式

 

按运算符的优先级高低次序执行;若优先级相同,则按照结合性规则执行

如item+2*num中,*运算符的优先级比+运算符高,因此,先进行”2*num"运算,再与“item"运算

*p--中,*和--都是右结合,其运算顺序为p先与--结合,执行”p--"运算,所得结果再与*进行运算,相当于"*(p--)"

 
 
算术运算符分为基本算术运算符和自增/自减算术运算符

 

1.基本算术运算符

在C语言中,基本运算符有5个,

+——加法运算符

-—— 减法运算符

*——乘法运算符

/——除法运算符

%——求余运算符

注意:

扫描二维码关注公众号,回复: 4968434 查看本文章
    • 对除法运算符,如果两个整数相除,结果仍为整数(商向下取整),如:20/6得6;如果除数或被除数中有一个为负值,则舍入的方向是不固定的。

    • 如果参加+、-、*、/运算的两个数中至少有一个数为浮点数,则运算结果是double型数据,自动转换后所有数都按double型进行运算。

    • 求余运算符%,两个操作对象都必须是整数。结果的符号与运算符%左边的操作数的符号相同。如:20%6得2,-45%8得-5,45%-8得5.

    • 减法运算符还可以进行取负运算,此时该运算符为单目运算符,只需一个操作数。如num=-num,对num变量值取负。

    • 基本运算符的优先级次序

 
 
算术运算符的结合方向为“自左至右”。如在表达式“m-n+a"中,先执行”m-n",再与a相加
 

2.自增/自减算术运算符

++——自增运算符

--  ——自减运算符

作用是使整型变量的值加1或减1。这两个运算符只能用于变量,而不能用于常量或表达式。

自增/自减运算符都是单目运算符

表达式++i将i的值加1,使用i的值

表达式i++先使用i的值,再将i的值加1

如:i=51,求j

(1)j=++i——i的值先加1变为52,再赋值于j,j=52

(2)  j=i++——先将i的值赋值给j,j=51,再将i加1,i=52

++和--是单目运算符,其优先级高于基本算术运算符,于取负运算符-的优先级相同。起结合方向是“自右至左”

 

3.赋值运算符和赋值表达式

一般形式:变量=表达式

表达式就是使用运算符和小括号将数据连接起来的式子,如”2*num+item"

表达式末尾加上一个分号,就构成了表达式语句,则赋值语句:num=2*num+item;

注意:

    • 赋值运算符左边不能是常量或包含运算符的表达式(指针运算的表达式除外)

    • 赋值运算可连续进行,赋值运算符的结合性是“自右至左”结合如:i=(j=(k=120),先将120赋给k,k再赋给j,j再赋给i

    • 赋值运算符的优先级比算术运算符的优先级都低

    • 赋值运算符的右边表达式的值的类型于左边变量的类型不一致,则在赋值时会将右边表达式的值转化成左边变量的类型的值

    • 赋值表达式能以表达式形式出现在其他语句

    • 除了赋值运算符=外,还有+=、-=、*=、/=、%=,如a+=56等价于a=a+56

 

 

4.关系运算符和关系表达式

 

关系表达式的值式一个逻辑值,即“真”“假”

如,a为10,b为80,那么a>=b的结果为假

C语言规定:以数值0表示假,以1表示真

则a为200,b为80,那么a>b的结果就为1

 

关系运算符的优先级低于算术运算符,高于赋值运算符,其结合性是从左至右.

如a=50,b=30,c=68,a<b>c,相当于(a<b)>c,(a<b)的结果为0,0>c的结果为0,则整个表达式为0

 

关系运算符的操作数可以是整型数据(包括字符数据)、浮点型数据,也可以事指针型数据,但运算结果的类型都是int型

对于浮点型数据,由于存储可能存主误差,不能直接使用==运算符进行是否相等的比较,而应该采用fabs(fnumb-fnumb2)<1.0e-6。其中,fabs函数是求浮点数绝对值的库函数,使用的时候要包含fabs函数所在头文件:#include <math.h>

 

5.逻辑运算符和逻辑表达式

逻辑表达式只有真和假两个值,真为1,假为0

       

i

j

!i

i&&j

i||j


(1)逻辑非运算符(!)逻辑运算符的作用,上图示真值表

逻辑非运算符表示单个表示逻辑值取反

当其值为0时,逻辑值为加,则为0

(2)逻辑与运算符(&&)

逻辑与运算符表示仅当两个操作数同时为真时,才为真,如50&&60,为1

(3)逻辑或运算符(||)

逻辑或运算符表示只要其中一个操作数为真,结果就为真,两个同时为假时,结果才为假。

 

!的优先级高于&&的优先级,&&的优先级高于||的优先级;运算是自左至右的顺序,结合性为左结合性

另外,!与增量运算符++、--属于同一级,高于算术运算符的优先级;而&&和||低于算术运算符和关系运算符的优先级,但高于赋值运算符的优先级。

如,判断某一年(year)是否是闰年,闰年的满足条件是:能被4整除而不能被100整除,或者能被400整除

则可以用一个逻辑表达式表示:(year%4==0&&year%100!=0)||year%400==0

上式表达式值为真(即为1),则year为闰年;否则为非闰年

6.位运算符和位表达式

位运算式指二进制位的运算,位运算符 分为位逻辑运算符和移位运算符

 

     位逻辑运算符的作用                                                            

i j ~i i&j i|j i^j
0 0 1 0 0 0
0 1 1 0 1 1
1 0 0 0 1 1
1 1 0 1 1 0

位逻辑表达式中的操作数应该式整型或字符型,不允许式浮点型

(1)按位与运算符&

按位与的运算规则:如果两个相应的二进制位都为1,则该位的结果为1;否则为0.即

1&1=1    1&0=0   0&1=0   0&0=0

 

如:unsigned int i = 4988,j =63286,求i&j的结果

i为

     0001 0011 0111 1100

j为

      1111 0111 0011 0110

则i&j的运算为

     0001 0011 0111 1100

     1111 0111 0011 0110    (按位与&)


     0001 0011 0011 0100

 

(2)按位或运算符|

按位或运算规则:两个相应的二进制位只要有一个为1,则该位的结果为1;否则为0.即

1|1=1    0|1=1   1|0=1    0|0=0  

请自己运算 i | j 的结果

 

(3)按异或运算符^

按异或运算规则:如果参与运算的两个相应的二进制位相同,则该位的结果为0,否则为1.即

1^1=0   0^0=0   1^0=1    0^1=1

请自己运算 i ^ j 的结果

 

(4)按位取反运算符~

将一个二进制数按位取反,即将0变1,1变0,即

~1=0    ~0=1


注意:如果两个长度不同的数据进行位运算时,系统会将二者按右端对齐后再进行位运算,

例如i为int型,j为short型,要进行i&j运算,

如果j为正数,则左侧16位补满0;如果j为负数,则左侧16为补满1;

如果j为无符号整型数,则左侧16位也补满0.

 

位逻辑运算符的优先级关系时:~最高,&其次,^居中,|最后。都高于逻辑运算符而低于关系运算符

7.移位运算符和移位表达式

要求两个操作数都是整型数据

  • 左移位运算符<<

一般形式:

移位对象<<移位位数

将移位对象的值(以二进制形式表示)向左移动n位

 

如m= 0000 0000 0000 1011,求移位表达式m<<3的结果时多少?

向左移后的结果为0000 0000 0101 1000.运算后m的值不变,变化的是整个表达式

如m=11,左移三位结果是11*23=88

 

  • 右移位运算符>>

一般形式:

移位对象>>移位位数

将移位对象的值(以二进制形式表示)向右移动n位.

 

对正数,右移1位相当于该数除以2,右移n位相当于该数除以2n.

如果是无符号数,右移时,左边空出来的位全以0填充

如果时有符号位,正数时,左边空位用0填充;负数时,左边空位看编译系统补1或0

8.条件运算符和条件表达式

一般构成形式是:

表达式1?表达式2:表达式3

若表达式1的值为真,则条件运算符的值取表达式2的值;否则,条件运算符的值取表达式3的值

 

9.逗号运算符和逗号表达式

逗号可以作为运算符,也可作为分隔符

一般形式为:

表达式1,表达式2,表达式3,……,表达式n

 

逗号表达式的求解过程:

如,逗号表达式49+52,61+83,先进行49+52,再进行61+83,最后整个逗号表达式的值为144(61+83)

 逗号运算符的优先级是所有运算符中级别最低的,常用于循环语句(for中)

 

逗号作为分隔符时

具有相同类型的多个变量可在同一行中定义,其间用逗号隔开:

int i, j, k;

另外,函数的参数也用逗号进行分隔,

如:printf(“%d,%d,%d",a,b,c);

 

10.其他运算符

(1)&和*

&和*运算符都是单目运算符。&运算符用来取出其操作数的地址;*运算符是&的逆运算,它将操作数(即指针量,后面会讲)所指向的内存单元内容取出来。

 

(2)sizeof

sizeof是关键字,是单目运算符,用来计算某种类型或某种类型数据所占用的字节数。

 

如:sizeof(float)的值为4,表示float类型的1个数据占用4个字节;

       sizeof(data)用于计算变量data所在内存的大小

       sizeof也常用来计算数组或结构所需空间大小,以便进行动态存储空间的分配。

 

(3)强制类型转换运算符

强制类型转换运算符()用来强制将某种类型的数据转换为另一种类型的数据。

 

(4)基本运算符

基本运算符包括[ ]、( )、->、· ,其中,[ ]用于数组下标的表示,( )用于标识函数,->和·用于存取结构或联合中的成员。它们的优先级在所有运算符中是最高的。

 

11.混合运算与类型转换

类型转换的实质,是将某种数据类型的值转换为另一种数据类型的指。

转换方式有两种:自动类型转换和强制类型转换。

自动类型转换又称为隐式转换,由编译系统自动进行转换;

而强制类型转换又称为显式转换,由程序员通过强制类型转换运算符( )进行转换。

 

借用一下别人的图片

纵向箭头表示当运算对象为不同类型时转换的方向,

 

例如,int型与double型数据进行运算时,先将int型数据数据转换成double型,然后再进行运算,结果为double型。

 

举个例子:i为int型变量,f为float型变量,d为double型变量,e为long型,有 表达式  25+ 'c' +i * f - d/e

  • 进行25+ 'c' 的运算,先将 'c' 转换成整数99,运算结果为124
  • 由于 *比+优先,先进行 i * f 的运算。先将 i 与 f 都转换成double型,运算结果为double型。
  • 整数124与 i * f 的积相加。先将整数124转换成double型,结果为double型。
  • 将变量e化成double型,d/e的结果为double型。
  • 将25+ 'c' +i * f 的结果与d/e的商相减,结果为double型。

 

强制类型转换

强制类型转换要使用强制运算符( )

一般使用形式是

(数据类型名)变量           或      (数据类型名)(表达式)

如:double dou=12.4;int num;

num = (int) dou;

将dou的值由double型强制转换为int型,则为12

最后,num为12,dou为12.4

拓展

 sqrt函数要求参数必须是双精度型浮点数。

假设原来定义变量n是int型,则调用sqrt函数时可用sqrt((double)n);

将n的数据类型强制转换成double型。

 

 

 
 
 

猜你喜欢

转载自www.cnblogs.com/action0/p/10279977.html