700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C语言学习C程序设计——运算符和表达式

C语言学习C程序设计——运算符和表达式

时间:2020-01-10 01:35:46

相关推荐

C语言学习C程序设计——运算符和表达式

今天我们来看一看C语言中的运算符和表达式的相关知识。

让我们开始今天的学习。

这里写目录标题

运算符与表达式的概念一、运算符1.运算符的分类2.运算对象的数目(1)单目运算符(2)双目运算符(3)三目运算符小总结 2.运算符的优先级3.运算符的结合性4.运算符对类型的要求 二、表达式 算数运算符自增自减运算符自增自减运算符及其表达式自增自减运算符的求值顺序 关系运算符关系运算符及其表达式关系运算符的运算顺序 逻辑运算符逻辑运算符及其表达式逻辑运算符的求值顺序 条件运算符条件运算符及其表达式条件运算符的求值顺序 位运算符按位与运算符(&)按位或运算符(|)按位异或运算符按位取反运算符(~)左移运算符(<<)右移运算符(>>) 赋值运算符赋值运算符及其表达式左值与右值 取长度运算符逗号运算符圆括号运算符常量表达式

运算符与表达式的概念

C语言中的运算符有很多,其运算功能十分强大而且灵活。

运算符描述对运算对象执行的操作。

一、运算符

1.运算符的分类

按照功能分为以下几类:

算术运算符关系运算符逻辑运算符位运算符赋值运算符成员运算符指针运算符

分为以下三类:

单目运算符双目运算符三目运算符

2.运算对象的数目

运算符的目:运算符所连接的运算对象的数目。

在上面我们已经知道了运算符按目分为三类,接下来我们来详细的解释一下这三类。

(1)单目运算符

单目运算符,顾名思义就是只有一个运算对象。

它的表达式形式有2种:

前缀单目运算符;后缀单目运算符。

op expr //前缀单目运算符expr op //后缀单目运算符

代码示例:

&expr //前缀单目运算符,取地址运算expr++ //后置单目运算符,后置自增运算

其中,expr表示运算对象,op表示运算符。

(2)双目运算符

双目运算符,包含两个运算对象。

它的表达形式为:

expr1 op expr2

其中expr1和expr2表示运算对象,分别放置于运算符的两侧额,像减法运算符expr1-expr2.

(3)三目运算符

三目运算符,包括上运算对象。

在C语言中只有一个三目运算符,它就是条件运算符,它的表达式形式为:

expr1?expr2:expr3

其中expr1、expr2和expr3都表示运算对象,问号(?)和冒号(:)一起组成条件运算符。

小总结

有些运算符既是单目运算符,又是双目运算符。

例如符号(+,-)既可以表示单目运算符,又可以作为双目运算符。两种用法相互独立,各不相干。

对于这类运算符,需要根据该符号所处的上下文来确定它是单目还是双目运算符。

2.运算符的优先级

运算符的优先级:同一个表达式中不同的运算符进行计算时,其运算次序存在先后之分。运算时先处理优先级高的运算符,在处理优先级低的运算符。

代码示例:

m+n/z //先计算n/z后计算加法

不同的表达式则按照式子出现的先后次序决定运算次序。

代码示例:

m=a+b;//先计算m=a-b;//后计算

3.运算符的结合性

在一个式子中如果有两个以上统一优先级的运算符,其运算次序是按运算符的结合性来处理的。

C语言运算符分为:

左结合(方向)右结合(方向)

左结合(方向)自左向右处理

右结合(方向)自右向左处理

在C语言中,赋值运算符、条件运算符以及几乎所有的单目运算符都是自右向左,其余都是自左向右。

4.运算符对类型的要求

C语言运算符对运算对象的数据类型有要求。

例如:加法运算时,要求两个操作对象的数据类型相同,否则会出现编译错误。

代码示例:

int a=3,b=4,c;c=a+b;//正确,在加法运算中,两个操作对象的数据类型是相同的int a=3,c;double b=30.12;c=a+b;//在这种情况下,就要看编译器是否能将不同类型的数据自动转化为同一种数据类型。//一般情况下是可以转化为同一种数据类型的,但是也不排除有其他的可能性

对于双目运算符,通常要求它的两个运算对象具有相同的数据类型,或者其类型可以自动转化为同一种数据类型

二、表达式

由运算符和运算对象组成的式子称为表达式

最简单的表达式中仅包含一个常量或者变量,含有两个或更多运算符的表达式称为复合表达式

表达式有以下特性:

表达式的运算对象可以是常量、变量、函数调用和嵌套的表达式。表达式的计算是按照步骤进行的,称为表达式求值顺序。表达式的运算结果是和运算对象相关的。如果表达式的运算对象只是当常量、变量或函数调用,其运算结果就是常量、变量或函数调用值。而在复合表达式中,运算符合运算对象的结合方式决定了整个表达式的值,表达式的计算将按照优先级和结合性规定的次序进行。大多数便有一起在不影响计算结果时采用从左向右的数学习惯处理表达式的求值顺序,而且结合最多的是运算符号。表达式的运算需要考虑参与运算的数据对象是否拒用合法的数据类型以及是否需要进行类型转换。

算数运算符

算数运算符有以下几类:

算数运算符中,取正,取负运算符的优先级最高,乘法、除法、整数求余运算符的优先级高于加法、减法。

代码示例:

a%b与a-a/b*b等价35%6 //结果是5,取余运算,%运算符的结果是余数,而不是商。35/7 //结果是0,取商运算,/运算符的结果是商,而不是余数。

使用算数运算符要注意的几个点:

1.算数运算符中的运算对象可以是常量、变量或表达式,通常是数值类型,如整型,浮点型和字符型等。整数求余要求两个运算对象必须都是整型,包括char、short、int、long以及对应的unsigned类型,不能为其他类型。

2.除法(/)运算中,除数不能为0或接近0,否则会发生除0异常错误。

3.若两个运算对象是相同的数据类型,则算数运算结果是该数据类型。若两个运算对象的数据类型不同,则需要进行类型转换再计算,运算结果为转换后的类型。

自增自减运算符

自增自减运算符及其表达式

自增自减运算符表,如下:

自增自减运算符中,后置自增自减运算符的优先级高于前置自增自减运算符;自增自减运算符的优先级比算数运算符

a必须是变量;

自增运算符的功能是使变量增加1,自减运算符的功能是使变量减少1;

前置自增自减运算符是“先运算后使用”,即使用变量之前先使变量加1或减1;

后置自增自减运算符是“先使用后运算”,即使用变量之后,变量再加1或减1;

int m=4,n;n=++m;//m先加1,m=5,然后表达式使用m的值去赋值给n,n的值为5n=--m;//m先减1,m=3,然后表达式使用m的值去赋值给n,n的值为3n=m++;//表达式先使用m的值赋值给n,n的值为4,然后m再加1,m的值为5n=m--;//表达式先使用m的值赋值给n,n的值为4,然后m再减1,m的值为3

显然,前置和后置自增自减运算对变量本身来说作用是一样的,但对于使用它的表达式来说是有区别的。当表达式仅为自增自减运算时,前置和后置的效果完全相同。

自增自减的运算对象可以是字符型,整型和指针类型的变量,不能是常量,const变量,表达式和函数调用等。

自增自减运算符的求值顺序

前置自增自减运算符在一个语句中的求值顺序是:在这个语句执行之前,对自增自减运算符的运算对象(变量)加1或减1,然后再执行这个语句。

后置自增自减运算符在一个语句中的求值顺序是:在这个语句执行之后,对自增自减运算符的运算对象(变量)加1或减1,然后再执行这个语句。

代码示例:

int m=4,n;n=(m++)+(m++);//这里的n值为8,m的值为6.这是因为在这个语句中两个自增自减运算符都是后置运算符,//也就是说在先将m的值取出执行这个语句,即n=m+m,即n=4+4,即n=8.//之后m再进行两次自增,m的值为6.

关系运算符

关系运算符及其表达式

关系运算符表,如下:

关系运算符中,小于(<)、小于等于(<=)、大于(>)、大于等于(>=)的优先级比等于(==)和不等于(!=),整个关系运算符的优先级低于算数运算符。

关系运算符的运算规则是:若关系成立,那么结果为真;关系不成立,那么结果为假;

在使用关系运算符时要有以下几点需要注意:

关系运算符的运算对象可以是常量、变量或表达式,可以是数值类型或指针类型等。数值数据按大小进行比较,字符数据按ASCII码值的大小进行比较。判断相等应使用双等号(==),不要误写为单等号(=)。由于计算机存储的浮点数与数学上的实数有一定误差,因此对浮点数不能使用(==、!=)做相等或不等的运算,而是比较相对误差。

关系运算符的运算顺序

关系运算符很少有a>b>c这样的逻辑比较。因为按关系运算符的结合性先计算a>b,得到的结果是个逻辑值,将这个逻辑值再与后面的c比较,不合理。而且用a>b>c的运算结果并不能判定b是否在a与c之间。

代码示例:

int a=6,b=0,c=-2a>b>c//b在a与c之间,表达式为真int a=6,b=9,c=-2a>b>c//b不在a与c之间,表达式也为真

实际上a>b的结果按数值来看,要么为0(假),要么为1(真)。

逻辑运算符

逻辑运算符及其表达式

逻辑运算符表,如下:

在逻辑运算符中,逻辑非(!)的优先级最高,逻辑与(&&)的优先级次之,逻辑或的优先级最低

逻辑非的优先级高于算数运算符,而逻辑与和逻辑或的优先级低于算数运算符和关系运算符。

逻辑运算符的运算规则真值表,如下:

在使用逻辑运算符时需要注意的点:

逻辑运算符的运算对象可以是常量、变量或表达式,按逻辑值对待。在C语言中,把非0当成真,0当成假。一般情况下,逻辑运算符的运算对象应实是关系运算或逻辑运算的结果。因为这两种运算的结果是逻辑真,符合其要求。逻辑运算符主要用于逻辑判断、选择语句或循环语句中,通常和关系运算符一起使用。

C语言逻辑值得类型是整数类型,初学者常常混淆数值和逻辑值之间的转化。请记住:当表达式计算出的结果是逻辑值时,用1表示真,用0表示假。将数值数据当做逻辑值时,非0当做真,0当做假。

逻辑运算符的求值顺序

C语言逻辑与表达式a&&b的执行过程是:先计算a的值,若a的值为真,则计算b的值,并根据b的值结合真值表决定a&&b的结果(当b为真时结果为真,否则结果为假);若a的值为假,则不再计算b的值,直接得到a&&b的结果为假。C语言逻辑或表达式a||b的执行过程是:先计算a的值,若a的值为假,则计算b的值,并根据b的值结合真值表决定a||b的结果(当b为假时结果为假,否则为真);若a的值为真,则不再计算B的值,直接得到a||b的结果为真。

条件运算符

条件运算符及其表达式

条件运算符表,如下:

条件运算符是C语言中唯一一个三目运算符,其优先级低于算数运算符、关系运算符和逻辑运算符,仅仅高于赋值运算符和逗号运算符。

条件运算符的执行过程是:先计算a,若a的结果为真则继续计算b,并将b的结果作为条件运算的结果;若a的运算结果为假则计算c,并将c的结果作为条件运算的结果。

条件运算符的求值顺序

虽然条件运算符的结合性为自右向左,但是条件表达式(a?b:c)本身的求值顺序是先求解a,再求解b或c,其运算符结合性和运算符求值顺序是两个不同的概念。

位运算符

位运算是指数据以二进制位的形式进行的运算,C语言提供的位运算符,如下:

在编写硬件、操作系统、检测和嵌入式控制领域的程序时,位运算是非常有用的。

在位运算中,按位取反(~)优先级最高,位移运算(>>,<<)优先级次之,按位与(&)、按位异或(^)、按位或(|)优先级

由于是按二进制位进行运算,所以位运算符的运算对象应实整型数据。如果是有符号整型,位运算操作会连同符号位一起执行,使得符号发生不正常的变化。所以位运算符一般使用费无符号整型。

按位与运算符(&)

参与运算的两个数据按二进制位进行与运算,运算规则是:

0&0=0

0&1=0

1&0=0

1&1=1

按位与能实现如下一些特殊要求的运算:

指定的二进制位清零取整数中的指定二进制位保留指定位

按位或运算符(|)

参与运算的两个数据按二进制位进行或运算,运算规则是:

0|0=0

0|1=1

1|0=1

1|1=1

按位异或运算符

参与运算的两个数据按二进制位进行异或运算,所谓异或是指两个二进制数相同为0,相异为1,运算规则为:

0^0=0

0^1=1

1^0=1

1^1=0

异或的作用是判断两个对应位是否为异,按位异或能够实现如下一些特殊要求的运算:

使指定位翻转将两个值互换

按位取反运算符(~)

~是单目运算符,将一个整数中所有二进制位按位取反,即0变1,1变0.

无论是何种整型数据,-1按补码的形式存储时二进制位全是1,因此一个整数m与~m的加法或者按位或结果必然是-1,即m+ ~m=-1,m| ~m=-1.

左移运算符(<<)

(a<<b)的作用是将a的所用二进制位向左移b位,左边b位被移除,右边补b位0.

左移1位相当于a乘以2.计算机内部处理中左移比乘法运算快得多,因此乘以2n的幂运算可以用左移n位替代。

上述结论仅仅针对于无符号类型,若是有符号类型,由于向左移会使符号位发生变化,导致上述结论不成立。

右移运算符(>>)

(a>>b)的作用是将a的所用二进制位向右移b为,右边b位被移除,左边补b位0.

右移1位相当于a除以2.计算机内部处理中右移比除法运算快得多,因此除以2n的幂运算可以用右移n位替代。

赋值运算符

赋值运算符及其表达式

赋值运算符表,如下:

赋值运算符的优先级在所有运算符中较低仅仅高于逗号运算符。

其作用是将运算符右侧的表达式的值赋给左侧的变量,并且将该值作为整个表达式的值。

复合赋值运算符的含义,如下:

使用赋值运算符时要注意这几点:

赋值运算符与运算对象构成的式子称为赋值表达式。赋值表达式除完成赋值功能外,它本身也可以作为一个普通的表达式项参与运算。但表达式中包含过多的赋值表达式时会降低程序的可读性,理解困难,故不宜提倡。赋值运算符要求运算对象exper的类型应与lvalue类型相同,如果不相同会自动将exper的类型转化成lvalue的类型再赋值。转化过程中可能会产生精度丢失、数据错误等。

左值与右值

左值是指可以在赋值表达式左边或右边的表达式;

右值是指只能出现在赋值表达式右边而不能出现在左边的表达式。

C语言中只有变量、下标运算([ ])和间接引用运算(*)才能作左值,我们现在可以简单地将左值理解为变量。

常量、const变量、表达式和函数调用句不能作为左值,而右值可以是常量、变量、函数调用或表达式。

赋值运算左边的运算对象、自增自减运算的运算对象要求必须是左值。能成为左值的数据对象必须是用内存单元的对象。

取长度运算符

取长度运算符,如下:

sizeof是单目运算符,用于计算数据类型,变量或表达式的内存长度(即内存单元的字节数)。

sizeof是在编译时自动确定长度的,运行时sizeof表达式实际是一个无符号整型常量。程序中用sizeof运算,而不是之间用内存长度值,可以提高程序的可移植性。

逗号运算符

逗号运算符,如下:

逗号运算符的优先级是所有运算符最低的,其作用是连接多个表达式项。

逗号运算符的运算对象可以是任意类型的表达式,当用多个表达式项,从左向右依次求出每个表达式的值,整个逗号表达式的值是最右边表达式的值。

圆括号运算符

圆括号运算符,如下:

圆括号运算符的优先级是所用运算符中最高的,取作用是提升其括起来的表达式的优先级。

圆括号运算符的运算对象可以是任意类型的表达式,并且允许嵌套使用。嵌套时最内层的括号优先级最高,最外边的括号优先级最低。

一般地,为了清除地表达求值顺序,应该使用圆括号运算符清晰地表明求值顺序,而不是写合法的但难于阅读的表达式。

常量表达式

仅由常量、const变量和运算符组成的式子称为常量表达式。常量表达式在编译时就确定其值了,因此在程序运行时常量表达式本质上就是一个常量值。

本次介绍就到这里了,大家辛苦了。谢谢大家阅读!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。