运算符优先级小结
2016-05-27 21:52
246 查看
运算符总结
运算符+ - * / % > < >= <= == != & | ^ 以及各种复合赋值运算符要求两
边的操作数类型一致,条件运算符?:要求后两个操作数类型一致,这些
运算符在计算之前都需要做
Usual Arithmetic Conversion(类型转换)
下面按优先级从高到低的顺序总结一下
C 语言的运算符,每一条所列的
各运算符具有相同的优先级,
对于同一优先级的多个运算符按什么顺序计算也有说明,双目运算符就简单地用“左结合”或“右结合”来说明了
1、标识符、常量、字符串和用()括号套起来的表达式是组成表达式的最
基本单元,在运算中做操作数,优先级最高。
2、后缀运算符,包括数组取下标[]、函数调用()、结构体取成员“.”、指
向结构体的指针取成员->、后缀自增++、后缀自减--。如果一个操作数
后面有多个后缀,按照离操作数从近到远的顺序(也就是从左到右)依
次计算,比如
a.name++,先算
a.name,再++,这里的.name
应该看成 a
的一个后缀,而不是把.看成双目运算符。
3、单目运算符,包括前缀自增++、前缀自减--、sizeof、类型转换()、
取地址运算&、指针间接寻址*、正号+、负号-、按位取反~、逻辑非!。
如果一个操作数前面有多个前缀,按照离操作数从近到远的顺序(也就
是从右到左)依次计算,比如!~a,先算~a,再求!。
4、乘*、除/、模%运算符。这三个运算符是左结合的。
5、加+、减-运算符。左结合。
6、移位运算符<<和>>。左结合。
7、关系运算符< > <= >=。左结合。
8、相等性运算符==和!=。左结合。
9、按位与&。左结合。
10、按位异或^。左结合。
11、按位或|。左结合。
12、逻辑与&&。左结合。
13、逻辑或||。左结合。
14、条件运算符?:。
例如 a ? b : c ? d : e
是看成(a ? b : c) ? d : e
还是 a ? b : (c ? d :
e)呢?C
语言规定是后者。
15、赋值=和各种复合赋值(*= /= %= += -= <<= >>=
&= ^= |=)。在双目运
算符中只有赋值和复合赋值是右结合的。
16、逗号运算符。左结合。
右结合就是如果连续两个同一优先级的运算符号挨着,那么相当于右边的一个加括号。
比如这里 相当于右边一个 加括号
或者 a= b= c 这里相当于 a = (b=c) 右边一个加括号
左结合就是相当于左边的加括号 比如 a + b + c 相当于 (a +b ) + c当然这个其实怎么结合都没差别 。
在标准C语言的文档里,对操作符的结合性并没有做出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。
每个操作符拥有某一级别的优先级,同时也拥有左结合性或右结合性。优先级决定一个不含括号的表达式中操作数之间的“紧密”程度。例如,在表达式a*b+c中,乘法运算的优先级高于加法运算符的优先级,所以先执行乘法a*b,而不是加法b+c。
但是,许多操作符的优先级都是相同的。这时,操作符的结合性就开始发挥作用了。在表达式中如果有几个优先级相同的操作符,结合性就起仲裁的作用,由它决定哪个操作符先执行。像下面这个表达式:
int a,b=1,c=2;
a=b=c;
我们发现,这个表达式只有赋值符,这样优秀级就无法帮助我们决定哪个操作先执行,是先执行b=c呢?还是先执行a=b。如果按前者,a=结果为2,如果按后者,a的结果为1。
所有的赋值符(包括复合赋值)都具有右结合性,就是在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,c先赋值给b,然后b在赋值给a,最终a的值是2。类似地,具有左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行。
结合性只用于表达式中出现两个以上相同优先级的操作符的情况,用于消除歧义。事实上你会注意到所有优先级相同的操作符,它们的结合性也相同。这是必须如此的,否则结合性依然无法消除歧义,如果在计算表达式的值时需要考虑结合性,那么最好把这个表达式一分为二或者使用括号。
例:
a=b+c+d
=是右结合的,所以先计算(b+c+d),然后再赋值给a
+是左结合的,所以先计算(b+c),然后再计算(b+c)+d
C语言中具有右结合性的运算符包括所有单目运算符以及赋值运算符(=)和条件运算符。其它都是左结合性。
在C语言中有少数运算符在C语言标准中是有规定表达式求值的顺序的:
1:&& 和 || 规定从左到右求值,并且在能确定整个表达式的值的时候就会停止,也就是常说的短路。
2:条件表达式的求值顺序是这样规定的:
test ? exp1 : exp2;
条件测试部分test非零,表达式exp1被求值,否则表达式exp2被求值,并且保证exp1和exp2两者之中只有一个被求值。
3:逗号运算符的求值顺序是从左到右顺序求值,并且整个表达式的值等于最后一个表达式的值,注意逗号','还可以作为函数参数的分隔符,变量定义的分隔符等,这时候表达式的求值顺序是没有规定的!
判断表达式计算顺序时,先按优先级高的先计算,优先级低的后计算,当优先级相同时再按结合性,或从左至右顺序计算,或从右至左顺序计算。
运算符+ - * / % > < >= <= == != & | ^ 以及各种复合赋值运算符要求两
边的操作数类型一致,条件运算符?:要求后两个操作数类型一致,这些
运算符在计算之前都需要做
Usual Arithmetic Conversion(类型转换)
下面按优先级从高到低的顺序总结一下
C 语言的运算符,每一条所列的
各运算符具有相同的优先级,
对于同一优先级的多个运算符按什么顺序计算也有说明,双目运算符就简单地用“左结合”或“右结合”来说明了
1、标识符、常量、字符串和用()括号套起来的表达式是组成表达式的最
基本单元,在运算中做操作数,优先级最高。
2、后缀运算符,包括数组取下标[]、函数调用()、结构体取成员“.”、指
向结构体的指针取成员->、后缀自增++、后缀自减--。如果一个操作数
后面有多个后缀,按照离操作数从近到远的顺序(也就是从左到右)依
次计算,比如
a.name++,先算
a.name,再++,这里的.name
应该看成 a
的一个后缀,而不是把.看成双目运算符。
3、单目运算符,包括前缀自增++、前缀自减--、sizeof、类型转换()、
取地址运算&、指针间接寻址*、正号+、负号-、按位取反~、逻辑非!。
如果一个操作数前面有多个前缀,按照离操作数从近到远的顺序(也就
是从右到左)依次计算,比如!~a,先算~a,再求!。
4、乘*、除/、模%运算符。这三个运算符是左结合的。
5、加+、减-运算符。左结合。
6、移位运算符<<和>>。左结合。
7、关系运算符< > <= >=。左结合。
8、相等性运算符==和!=。左结合。
9、按位与&。左结合。
10、按位异或^。左结合。
11、按位或|。左结合。
12、逻辑与&&。左结合。
13、逻辑或||。左结合。
14、条件运算符?:。
例如 a ? b : c ? d : e
是看成(a ? b : c) ? d : e
还是 a ? b : (c ? d :
e)呢?C
语言规定是后者。
15、赋值=和各种复合赋值(*= /= %= += -= <<= >>=
&= ^= |=)。在双目运
算符中只有赋值和复合赋值是右结合的。
16、逗号运算符。左结合。
右结合就是如果连续两个同一优先级的运算符号挨着,那么相当于右边的一个加括号。
比如这里 相当于右边一个 加括号
或者 a= b= c 这里相当于 a = (b=c) 右边一个加括号
左结合就是相当于左边的加括号 比如 a + b + c 相当于 (a +b ) + c当然这个其实怎么结合都没差别 。
在标准C语言的文档里,对操作符的结合性并没有做出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。
每个操作符拥有某一级别的优先级,同时也拥有左结合性或右结合性。优先级决定一个不含括号的表达式中操作数之间的“紧密”程度。例如,在表达式a*b+c中,乘法运算的优先级高于加法运算符的优先级,所以先执行乘法a*b,而不是加法b+c。
但是,许多操作符的优先级都是相同的。这时,操作符的结合性就开始发挥作用了。在表达式中如果有几个优先级相同的操作符,结合性就起仲裁的作用,由它决定哪个操作符先执行。像下面这个表达式:
int a,b=1,c=2;
a=b=c;
我们发现,这个表达式只有赋值符,这样优秀级就无法帮助我们决定哪个操作先执行,是先执行b=c呢?还是先执行a=b。如果按前者,a=结果为2,如果按后者,a的结果为1。
所有的赋值符(包括复合赋值)都具有右结合性,就是在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,c先赋值给b,然后b在赋值给a,最终a的值是2。类似地,具有左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行。
结合性只用于表达式中出现两个以上相同优先级的操作符的情况,用于消除歧义。事实上你会注意到所有优先级相同的操作符,它们的结合性也相同。这是必须如此的,否则结合性依然无法消除歧义,如果在计算表达式的值时需要考虑结合性,那么最好把这个表达式一分为二或者使用括号。
例:
a=b+c+d
=是右结合的,所以先计算(b+c+d),然后再赋值给a
+是左结合的,所以先计算(b+c),然后再计算(b+c)+d
C语言中具有右结合性的运算符包括所有单目运算符以及赋值运算符(=)和条件运算符。其它都是左结合性。
在C语言中有少数运算符在C语言标准中是有规定表达式求值的顺序的:
1:&& 和 || 规定从左到右求值,并且在能确定整个表达式的值的时候就会停止,也就是常说的短路。
2:条件表达式的求值顺序是这样规定的:
test ? exp1 : exp2;
条件测试部分test非零,表达式exp1被求值,否则表达式exp2被求值,并且保证exp1和exp2两者之中只有一个被求值。
3:逗号运算符的求值顺序是从左到右顺序求值,并且整个表达式的值等于最后一个表达式的值,注意逗号','还可以作为函数参数的分隔符,变量定义的分隔符等,这时候表达式的求值顺序是没有规定的!
判断表达式计算顺序时,先按优先级高的先计算,优先级低的后计算,当优先级相同时再按结合性,或从左至右顺序计算,或从右至左顺序计算。
相关文章推荐
- Linux C函数参考手册(PDF版)
- C# partial关键字说明
- Lua教程(十七):C API简介
- 简单谈谈lua和c的交互
- C#中的委托数据类型简介
- C#编写的艺术字类实例代码
- C#实现打造气泡屏幕保护效果
- 举例讲解C#编程中委托的实例化使用
- 使用C#代码获取存储过程返回值
- C++中explict关键字用法
- C/C++数据对齐详细解析
- 利用C语言来求最大连续子序列乘积的方法
- 字符串的组合算法问题的C语言实现攻略
- C 语言基础教程(我的C之旅开始了)[三]
- 学习C和C++的9点经验总结
- C++中的extern “C”用法详解
- C 语言基础教程(我的C之旅开始了)[七]
- 最大子矩阵问题实例解析
- C字符串操作函数实现方法小结