- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
关于C运算符的优先级
关于C运算符的优先级
运算符中具有最高优先级的是那些不参与运算的操作符:例如下标运算符( [] ),函数调用,结构体变量运算符(. -),它们的结合方向是自左向右。别的书没说过。
接着就是一元运算符,它们在参与运算的操作符中具有最高优先级。因为函数调用的优先级高于一元运算符,因此当p为一函数指针时,必须用(*p)( )来调用函数,*p( )则表明p为返回一指针的函数。C语言就是如此奥妙一元运算符的结合方向是自右向左,跟上面相反因此*p++应与*(p++)p指针的地址+1里的内容相同,而不与(*p)++相同。
再接着就是二元运算符,算术运算符在里面具有最高的优先级,再下面是移位运算符,关系运算符,逻辑运算符,条件运算符【记忆:移位关系,逻辑条件】,赋值运算符,最后是逗号运算符,当判断这些运算符的优先级时,有两点要记住:
1、每个逻辑运算符的优先级低于关系运算符的优先级
2、移位运算符的优先级高于关系运算符,但是低于算术运算符
在不同运算符类别中,没有特别需要注意的地方。乘法、除法、取余具有相同的优先级,加法、减法具有相同的优先级,两个移位运算符具有相同的优先级。
有一点要注意的是六个关系运算符具有不相同的优先级:“==”和“!=的优先级比其他四个要低。因此下面的表达式的意思是判断a和b比较结果和c和d的比较结果是否相等。
a b == c d (ab)==(cd)
三元条件运算符的优先级比上面提及的运算符的都要低,这就允许在选择表达式中有关系运算符的逻辑组合,如下所示:
z = a b b c ? d : e
if((ab(bc))
????? {
?????????? Z=d;
????? }
? Else
????? {
?????????? Z=e;
?????? }
上面语句同时也说明了赋值运算符的优先级比关系运算符的低,而且所有的复合赋值运算符具有相同的优先级,并且它们的运算方向是从右到左。因此:
a = b = c
等同于
b = c; a = b;
优先级最低的是逗号运算符,这比较容易理解,因为当一条语句由多个表达式组成时,逗号在这里相当于分号的功能。
在混合优先级判断中,赋值运算符是比较??手的。考虑下面的例子,它执行的功能是拷贝一个文件:
while (c=getc(in) != EOF)加个括号
putc(c,out);
“while”语句中要实现的功能是给变量c赋值,然后与EOF进行比较来终止循环,不幸的是,赋值操作的优先级低于比较操作的优先级,因此c的值是getc(in)与EOF比较的结果,getc(in)的值将被弃掉,因此拷贝生成的文件将是一连串的1。
想实现以上的功能并不困难,可以简单修改如下:
while ((c=getc(in)) != EOF)
putc(c,out);
然而,在复杂语句中,这种优先级混淆的问题是很难被发现的。在UNIX系统下面的几个不同版本的连接程序中曾经出现过如下的错误语句:赋值在别的地方,为什么在这个地方赋
if( (t=BTYPE(pt1-aty)==STRTY) || t==UNIONTY ){
此条语句要实现的功能是给变量t赋值,然后判断是否与STRTY相等或者与UNIONTY相等,但是这条语句真正实现的功能并不是这样。
C语言中,逻辑运算符的优先级分配有其历史的原因。B语言,也就是C语言的前身,也有相当于C语言中的 和 | 操作符,尽管它们被定义用作位运算符,但是当用于条件上下文时,编译器会自动将它们当作 和 || 运算。
??????? C++/C语言的运算符有数十个,运算符的优先级与结合律如表所示。注意一元运算符+ - *的优先级高于对应的二元运算符。下表中包括了C++所有的操作符,共有16级优先级。表中的操作符如果重复出现,则第1次出现的是单目运算符,第二次出现的的双目运算符。
优先级运算符结合律(从高到低排列)1() [] - :: .左→右2! ~ + - ++ -- * (强制转换类型) sizeof new delete右→左3.* - *左→右4* / %左→右5+ -左→右6 左→右7 = = 左→右8== !=左→右9左→右10^左→右11|左→右12左→右13||左→右14?:右→左15= *= /= += -= |= = = %= = ^= = ||=右→左17左→右 “当按照常规方式使用时,可能引起误会的任何运算符”就是存在错误优先级的运算符。
.的优先级高于*。-操作符用于消除这个问题。*p.f变成了*(p.f)而不是(*p).f
[]高于*,于是in
文档评论(0)