c语言运算符优先级结合,C语言运算符优先级及结合性

今天去翻了下C语言运算符的优先级和结合性,发现当初学习的时候就没认真记住,惭愧。发现一篇讲得不错的文章,编辑了下转来供以后翻阅。

C语言运算符优先级表(由上至下,优先级依次递减)

运算符

结合性

() [] -> .

自左向右

! ~ ++ -- - (type) * & sizeof

自右向左

* / %

自左向右

+ -

自左向右

<< >>

自左向右

< <= > >=

自左向右

== !=

自左向右

&

自左向右

^

自左向右

|

自左向右

&&

自左向右

||

自左向右

?:

自右向左

Assignments

自右向左

,

自左向右

1、() [] -> .之类的理所当然是最优先的,其实它们压根也不算什么运算符了。

2、除了上面的四种运算符之外,接下来就是单目运算符,也就是! ~ ++ -- - (type) * & sizeof 了。记住它们的顺序可是自右向左啊!其实结合实例是很容易理解的,比如i++等。

3、接着是双目运算符了,也是C语言运算符优先级中最容易让人混淆的地方了。其实也没有那么可怕,你认真观察就会发现。在双目运算符中,算术运算符优先级最高,然后是移位运算符,接着是关系运算符,再着是逻辑运算符。不过这边需要说的是,在关系运算符中,< <= > >=比== !=的优先级来得高。此外,在逻辑运算符中,与运算又比或运算优先级来得高,异或则处于二者之间。同样的,你可以类比出&&与||的优先级关系。

4、在双目操作符之后,就是三目操作符了,没有什么好说的了。

5、然后是赋值操作符,你也许会把赋值操作符与三目运算符的优先级搞混。没有关系,我想你一定写过这样的语句(如果没有,请你记住!):max = (a>b)?a:b; ,从这个语句里,你就不难记住赋值运算符为什么比三目运算符的优先级低了!

6、逗号运算符是分割各个子语句的(感觉这么说有点不准确,不过我想大家会明白我的意思的),自然优先级最低了,我想这个应该不是很容易混淆的。

总结一下,按运算符优先级从高到低:单目运算符->双目运算符->三目运算符->赋值运算符->逗号运算符 特别在双目运算符中,按 运算符优先级从高到低:算术运算符->移位运算符->关系运算符(其中== 和 !=优先级又较低)->逻辑运算符(按位与-〉按位异或-〉按位或-〉逻辑与-〉逻辑或)!

运算符的结合性指同一优先级的运算符在表达式中操作的组织方向, 即: 当一个运算对象两侧运算符的优先级别相同时, 运算对象与运算符的结合顺序, C 语言规定了各种运算符的结合方向( 结合性) 。大多数运算符结合方向是“自左至右”, 即: 先左后右, 例如a- b+c, b 两侧有- 和+两种运算符的优先级相同, 按先左后右结合方向, b 先与减号结合, 执行a- b 的运算, 再执行加c 的运算。除了自左至右的结合性外, C 语言有三类运算符参与运算的结合方向是从右至左。即: 单目运算符, 条件运算符, 以及赋值运算符。关于结合性的概念在其他高级语言中是没有的, 这是C语言的特点之一。

++a 或a++和--a 或a--分别称为前置加或后置加运算和前置减或后置减运算,都是单目运算符。值得注意的是, 前置、后置运算只能用于变量, 不能用于常量和表达式, 且结合方向是从右至左。如当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++的问题, 因为++运算符的运算对象只能是整型变量而不能是表达式或常数, 所以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=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=- 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语言表达式时, 首先应按优先级进行运算, 然后在同一优先级中按结合方向进行运算。

为什么(i++) + (j++) +(k++)与(i++ )+ (i++);的值不可预知

http://tieba.baidu.com/p/1972991734

&表示逻辑与或者位运算与。

&&表示逻辑与,短路计算。

C语言运算符优先级和结合性一览表

所谓优先级就是当一个表达式中有多个运算符时,先计算谁,后计算谁.这个其实我们在小学学算术的时候就学过,如1+4÷2. 但是C语言中的运算符已经远不止四则运算中的加减乘除了,还有其他很多运算符.当它们出 ...

C语言运算符优先级和结合性

运算符优先级和结合性 优先级                                       运算符 结合性                                         ...

C语言运算符优先级和ASCII表

1. C语言运算符优先级及结合性 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 -- () 圆括号 (表达式)/函数名(形参表) -- . 成 ...

一道c语言运算符优先级问题

一道c语言运算符优先级问题 #include using namespace std; int main() { char test[] = {"This ...

C语言运算符优先级总结

一 写在开头1.1 本文内容本文内容为C语言中运算符优先级的总结.转载于:https://blog.csdn.net/huangblog/article/details/8271791,感谢原作者的付 ...

&lpar;转&rpar;C语言运算符优先级 详细列表

C语言运算符优先级 详细列表 文章转自:Slyar Home 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右   () 圆括号 (表达式)/函数 ...

C运算符优先级和结合性

C中运算符优先级和结合性一览表: 在上表中能总结出一下规律: (1)结合方向只有三个是从右往左,其余都是从左往右: (2)逗号运算符的优先级最低: (3)对于优先级,有一个普遍规律:算术运算符 &gt ...

c 语言 运算符 优先级

C 语言 运算法优先级 从高 到 低 优先级 运算符 功能 适用范围 结合性 15 () [] . -> 括号 下标 存取成员 存取成员 表达式 数组 结构联合 结构联合 → (左→右) 14 ...

【部分原创】标准C语言的优先级、结合性、求值顺序、未定义行为和非确定行为浅析

零. 优先级    在C++ Primer一书中,对于运算符的优先级是这样描述的:     Precedence specifies how the operands are grouped. It ...

随机推荐

UML(Unified Model Language)统一建模语言

一.九种图 二.类间关系 一.UML中的九种图 1.用例图(use case diagrams) [概念]描述用户需求,从用户的角度描述系统的功能 [描述方式]椭圆表示某个用例:人形符号表示角色 [目 ...

Python操作Excel之xlwt

#写入import xlwtworkbook=xlwt.Workbook()sheetn=workbook.add_sheet(u"测试数据",cell_overwrite_ok= ...

DNS解析过程

参考: http://www.maixj.net/ict/dns-chaxun-9208 http://blog.it985.com/8389.html DNS(Domain Name System) ...

SharePoint 服务器端对象模型 之 使用LINQ进行数据访问操作(Part 2)

(四)使用LINQ进行列表查询 在生成实体类之后,就可以利用LINQ的强大查询能力进行SharePoint列表数据的查询了.在传统SharePoint对象模型编程中,需要首先获取网站对象,再进行其他操 ...

FineUI第六天---表单控件

表单控件 所有表单控件都有的属性有: ShowLabel:是否显示标签(默认值:true). ShowEmptyLabel:是否显示空白的标签(默认值:false). Label:标签文本(默认值:& ...

A Gentle Introduction to the Gradient Boosting Algorithm for Machine Learning

A Gentle Introduction to the Gradient Boosting Algorithm for Machine Learning by Jason Brownlee on S ...

java环境中基于jvm的两大语言:scala,groovy

一.java环境中基于jvm的两大语言:scala,groovy 可以在java项目里混编这两种语言: scala:静态语言,多范式语言,糅合了面向对象.面向过程:可以与java和net互操作:融汇了 ...

Java中的移位操作符

记住所有的移动位数,针对的都是补码来讲的,所以要先将十进制整数转换成补码后,然后再来进行移位操作 移位操作 还要注意类型的约束条件,例如int,移动范围是0-31位,所以看补码只能看最后五位,这才是有 ...

ThinkPHP 3 的输出

一.ThinkPHP 3 的输出 (重点) a.通过 echo 等PHP原生的输出方式在页面中输出 b.通过display方法输出 想分配变量可以使用assign方法 c.修改左右定界符 休要修改配置 ...

01&lowbar;JNI是什么,为什么使用,怎么用JNI,Cygwin环境变量配置,NDK案例(使用Java调用C代码)&comma;javah命令使用

1 什么是JNI JNI Java本地开发接口 JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(C/C++) 通过这个协议,java代码就可以调用外部的C/C++代码,外部的C/C++ ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值