运算符优先级和结合性

上传人:lisu****2020 文档编号:147617613 上传时间:2022-09-02 格式:DOC 页数:4 大小:26.50KB
收藏 版权申诉 举报 下载
运算符优先级和结合性_第1页
第1页 / 共4页
运算符优先级和结合性_第2页
第2页 / 共4页
运算符优先级和结合性_第3页
第3页 / 共4页
资源描述:

《运算符优先级和结合性》由会员分享,可在线阅读,更多相关《运算符优先级和结合性(4页珍藏版)》请在装配图网上搜索。

1、C语言运算符优先级表(由上至下,优先级依次递减)运算符结合性() - .自左向右! + - - (type) * & sizeof自右向左* / %自左向右+ -自左向右自左向右 =自左向右= !=自左向右&自左向右自左向右|自左向右&自左向右|自左向右?:自右向左Assignments自右向左,自左向右1、() - .之类的理所当然是最优先的,其实它们压根也不算什么运算符了。2、除了上面的四种运算符之外,接下来就是单目运算符,也就是! + - - (type) * & sizeof 了。记住它们的顺序可是自右向左啊!其实结合实例是很容易理解的,比如i+等。3、接着是双目运算符了,也是C语言运

2、算符优先级中最容易让人混淆的地方了。其实也没有那么可怕,你认真观察就会发现。在双目运算符中,算术运算符优先级最高,然后是移位运算符,接着是关系运算符,再着是逻辑运算符。不过这边需要说的是,在关系运算符中, =比= !=的优先级来得高。此外,在逻辑运算符中,与运算又比或运算优先级来得高,异或则处于二者之间。同样的,你可以类比出&与|的优先级关系。4、在双目操作符之后,就是三目操作符了,没有什么好说的了。5、然后是赋值操作符,你也许会把赋值操作符与三目运算符的优先级搞混。没有关系,我想你一定写过这样的语句(如果没有,请你记住!):max = (ab)?a:b; ,从这个语句里,你就不难记住赋值运算

3、符为什么比三目运算符的优先级低了!6、逗号运算符是分割各个子语句的(感觉这么说有点不准确,不过我想大家会明白我的意思的),自然优先级最低了,我想这个应该不是很容易混淆的。总结一下,按运算符优先级从高到低:单目运算符-双目运算符-三目运算符-赋值运算符-逗号运算符 特别在双目运算符中,按 运算符优先级从高到低:算术运算符-移位运算符-关系运算符(其中= 和 !=优先级又较低)-逻辑运算符(按位与-按位异或-按位或-逻辑与-逻辑或)!运算符的结合性指同一优先级的运算符在表达式中操作的组织方向, 即: 当一个运算对象两侧运算符的优先级别相同时, 运算对象与运算符的结合顺序, C 语言规定了各种运算符

4、的结合方向( 结合性) 。大多数运算符结合方向是“自左至右”, 即: 先左后右, 例如a- b+c, b 两侧有- 和+两种运算符的优先级相同, 按先左后右结合方向, b 先与减号结合, 执行a- b 的运算, 再执行加c 的运算。除了自左至右的结合性外, C 语言有三类运算符参与运算的结合方向是从右至左。即: 单目运算符, 条件运算符, 以及赋值运算符。关于结合性的概念在其他高级语言中是没有的, 这是C语言的特点之一。+a 或a+和-a 或a-分别称为前置加或后置加运算和前置减或后置减运算,都是单目运算符。值得注意的是, 前置、后置运算只能用于变量, 不能用于常量和表达式, 且结合方向是从右

5、至左。如当i=6 时, 求- i+的值和i 的值。由于“- ”(负号) “+”为同一个优先级, 故应理解为- (i+),又因是后置加, 所以先有-i+的值为-6, 然后i 增值1 为7, 即i=7。例1 main()int a=3,b=5,c;c=a*b+b;printf ( “c=%d”, c);要得出c 的值, 首先要搞清+的含义。+运算符的结合方向是自右向左的, 如果将表达式理解为:c=a*b+(+b);实际上C 编译器将表达式处理为:c=(a*b+)+b, 因为C 编译器总是从左至右尽可能多地将若干个字符组成一个运算, 如i+j 等价于(i+)+j。接下来是解决a*b+的问题, 因为+

6、运算符的运算对象只能是整型变量而不能是表达式或常数, 所以a*b+显然是a*(b+)而非(a*b)+, 因此整个表达式就是c=(a*(b+)+b,结果为c=20。例2 main()int i=1,j;j=i+i+i+;printf( “i=%d,j=%d/n”, i,j);例3 main()int i=1,m;m=(+i)+(+i)+(+i);printf( “i=%d,m=%d/n”, i,m);j 和m 的值均由表达式求得, 并且这两个表达式均由自增运算符、加法运算符和赋值运算符组成。那么, 它们的值到底为多少呢? j=1+1+1=3 还是j=1+2+3=6? m=2+3+4=9 还是m=

7、4+4+4=12?上机运行结果为: i=4,j=3,m=10(VC6.0)。分析: 运算符“+”,“+”和“=”的优先级是递减的, 在计算时,先进行自增运算, 再进行加法运算, 最后是赋值运算。而自增运算又根据“i+”和“+i”的不同定义得到不同的值。i+i+i+先将i 原值(1)取出, 作为表达式中i的值进行加法运算得到3, 然后再实现三次自加; (+i)+(+i)+(+i)的计算与编译器有关。例4 设a=6, 求赋值表达式a+=a-=a-a*a 的值。由于“*”(乘号)、“- ”(减号)优先级高于“+=”、“- =”, 且“*”优先级高于“- ”, 故先求a- a*a, 即6- 6*6=-

8、 30, 由“+=”,“-=”为同一优先级, 且是从右至左的结合方向, 再求a- =- 30,即a=a- (- 30)=6+30=36, 最后求a+=36, 即a=a+36=36+36=72, 所以赋值表达式的值为a=72。例5 设m=1,n=2,b=3, 求赋值表达式m+=n-=-b 的值。这里共有四个运算符“+=”、“-=”、“-”(负号)、“-”, 由运算符优先级, 应先计算-b, 但“-”与“-”(负号)优先级相同, 如按从右到左的结合方向, 它可能是-(-b), 也可能是-(-b), 究竟是哪一个呢?前面已讲过, 前置运算只能用于变量, 不能用于表达式, 而(-b)不是一个变量, 而是表达式, 故只能是-(-b), 即为-(3-1)=-2; 然后计算n-=-2, 即n=n-(-2)=2-(-2)=4; 最后计算m+=4, 即m=m+4=1+4=5, 所以赋值表达式的值m=5。当看到一个复杂的C语言表达式时, 首先应按优先级进行运算, 然后在同一优先级中按结合方向进行运算。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!