C语言运算符优先级表
c语言的算术运算符优先级
c语言的算术运算符优先级(原创版)目录1.引言2.C 语言中的算术运算符3.算术运算符的优先级4.结合性和结合方向5.举例说明算术运算符的优先级和结合性6.结论正文【引言】在 C 语言编程中,算术运算符是非常常见的一种操作。
了解算术运算符的优先级和结合性对于编写高效的代码至关重要。
本文将详细介绍 C 语言中算术运算符的优先级和结合性。
【C 语言中的算术运算符】C 语言中的算术运算符包括:+ 加法运算符- 减法运算符* 乘法运算符/ 除法运算符% 取模运算符【算术运算符的优先级】C 语言中算术运算符的优先级从高到低依次为:1.**(指数运算符)2.*(乘法运算符)和 /(除法运算符)3.+(加法运算符)和 -(减法运算符)4.%(取模运算符)【结合性和结合方向】C 语言中算术运算符的结合性为从左到右,即先计算左边的运算,再计算右边的运算。
例如,对于表达式 a + b + c,首先计算 a + b,然后计算结果与 c 的和。
【举例说明算术运算符的优先级和结合性】假设有一个表达式:a * (b + c)根据算术运算符的优先级,首先计算乘法运算符 *,然后计算加法运算符 +。
因此,表达式可以分解为 a * b + a * c。
再举一个例子:a / (b * c)根据算术运算符的优先级,首先计算乘法运算符 *,然后计算除法运算符 /。
因此,表达式可以分解为 a / b / c。
【结论】了解 C 语言中算术运算符的优先级和结合性对于编写高效的代码至关重要。
通过合理利用算术运算符的优先级和结合性,可以优化代码结构,提高代码可读性。
c语言中优先级最高的运算符
c语言中优先级最高的运算符在C语言中,优先级最高的运算符是括号(())。
括号可以改变表达式中运算符的优先级,使其先进行括号内的运算。
如:(a+b)*c,括号内的a+b先进行运算,然后再乘以c。
括号的使用可以提高表达式的可读性和准确性,特别是在复杂的算术表达式中。
例如,表达式(a+b)*(c+d)/(e+f)中,括号可以使运算的优先级更明确,避免因优先级引起的错误。
除了括号外,C语言中的其他运算符根据优先级从高到低依次为:单目加(+)和减(-)、取地址(&)和取值(*)、逻辑非(!)、递增(++)和递减(--)、按位取反(~)、乘法(*)、除法(/)、取余(%)、加法(+)和减法(-)、移位(<<和>>)、关系运算符(<、<=、>、>=、==、!=)、按位与(&)、按位异或(^)和按位或(|)、逻辑与(&&)和逻辑或(||)、条件运算符(?:)、赋值运算符(=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=和|=)。
虽然C语言中的运算符优先级是定义好的,但在编写程序时,我们也需要注意运算符的优先级,以免出现错误的结果。
此外,合理地使用括号和空格也可以提高程序的可读性和准确性,让代码更具可维护性。
c语言中运算符的优先级及结合顺序
C语言中运算符的优先级及结合顺序一、概述C语言是一种广泛应用的计算机编程语言,学习C语言的运算符的优先级及结合顺序对于理解程序的执行过程和写出高效的代码至关重要。
本文将针对C语言中常见的运算符的优先级和结合顺序进行详细的介绍和解析,希望能对读者有所帮助。
二、运算符的优先级1. 括号优先级括号具有最高的优先级,括号中的表达式会先于其他运算符进行计算,其优先级最高。
例如:```int a = 3, b = 4, c = 5;int result = (a + b) * c;```先计算括号中的值,再进行乘法运算。
2. 单目运算符优先级单目运算符的优先级次之,包括正负号、递增递减等运算符。
例如: ```int a = 5;int result = -a;先执行取反操作。
3. 算术运算符的优先级在算术运算符中,乘除法的优先级高于加减法,同级运算符从左到右结合。
例如:```int result = 3 + 4 * 5 / 2;```首先计算乘除法,再进行加减法。
4. 关系运算符的优先级关系运算符(>、<、==等)的优先级次于算术运算符,且具有相同的优先级。
例如:```int a = 3, b = 4, c = 5;int result = a + b > c;```先计算加法,再进行比较运算。
5. 逻辑运算符的优先级逻辑与()、逻辑或(||)等逻辑运算符的优先级相对较低,且具有相同的优先级。
例如:int a = 4, b = 5, c = 6;int result = a > 3 b < 6 || c == 6;```逻辑与的优先级高于逻辑或,但都低于其他运算符。
6. 赋值运算符的优先级赋值运算符的优先级最低,且右结合。
例如:```int a = 5;a += 3;```将3加到a上再赋值给a。
三、运算符的结合顺序1. 左结合性大多数运算符都是左结合的,即从左向右进行计算。
例如: ```int result = 3 + 4 + 5;```从左向右进行加法运算。
c语言运算符优先级题目
c语言运算符优先级题目在C语言中,运算符的优先级是确定表达式中运算符执行顺序的重要规则。
当表达式中存在多个运算符时,运算符优先级决定了各个运算符的顺序。
下面是C语言中常见的运算符优先级从高到低的排序:1. 一元运算符优先级- 后缀++和--- 前缀++和--- 一元加号和减号+2. 乘法和除法运算符优先级- 乘法*- 除法/- 求余%3. 加法和减法运算符优先级- 加法+- 减法-4. 移位运算符优先级- 左移位<<- 右移位>>5. 关系运算符优先级- 小于<- 大于>- 小于等于<=- 大于等于>=6. 相等和不相等运算符优先级- 相等==- 不相等!=7. 位运算符优先级- 按位与&- 按位异或^- 按位或|8. 逻辑运算符优先级- 逻辑非!- 逻辑与&&- 逻辑或||9. 条件运算符优先级- 条件表达式?:10. 赋值运算符优先级- 赋值=- 复合赋值运算符+=, -=, *=, /=, %=11. 逗号运算符优先级- 逗号,这是C语言中运算符优先级的大致顺序。
在表达式中,高优先级的运算符先于低优先级的运算符进行计算。
当优先级相同时,按照从左到右的顺序进行计算。
下面是一个例子,解释了运算符优先级的使用:```c#include<stdio.h>int main() {int a = 5, b = 10, c = 15, d = 20;int result = 0;result = a + b * c / d;printf("Result 1: %d\n", result);result = (a + b) * c / d;printf("Result 2: %d\n", result);result = (a + b * c) / d;printf("Result 3: %d\n", result);return 0;}```在这个例子中,变量a、b、c和d分别赋值为5、10、15和20。
c语言运算符的优先级顺序表格
在C语言中,运算符的优先级顺序如下(从高到低):
1. 括号运算符:()
2. 数组下标运算符:[]
3. 结构体成员运算符:.
4. 指针成员运算符:->
5. 后缀递增/递减运算符:++,--
6. 前缀递增/递减运算符:++,--
7. 一元运算符:+(正号),-(负号),!(逻辑非),~(按位取反),*(指针取值),&(取地址),sizeof
8. 类型转换运算符:(type)
9. 乘法运算符:*,/,%
10. 加法运算符:+,-
11. 移位运算符:<<,>>
12. 关系运算符:>,>=,<,<=
13. 相等运算符:==,!=
14. 按位与运算符:&
15. 按位异或运算符:^
16. 按位或运算符:|
17. 逻辑与运算符:&&
18. 逻辑或运算符:||
19. 条件运算符:?:
20. 赋值运算符:=,+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=
21. 逗号运算符:,
请注意,优先级较高的运算符会先于优先级较低的运算符进行计算。
当有多个运算符出现时,可以使用括号来明确指定计算顺序,从而避免由于优先级导致的歧义或错误。
c语言字符的优先级顺序
c语言字符的优先级顺序
在C语言中,字符的优先级顺序如下(从高到低):
1. 括号运算符:`()`,括号用于改变表达式的优先级。
2. 结构体/联合体成员访问运算符:`.`和`->`,用于访问结构体或联合体的成员。
3. 后缀递增和递减运算符:`++`和`--`,用于增加或减少变量的值。
4. 一元运算符:`+`、`-`、`!`、`~`、`*`、`&`和`sizeof`,一元运算符对单个操作数进行操作。
5. 乘法、除法和求余运算符:`*`、`/`和`%`,用于进行乘法、除法和求余计算。
6. 加法和减法运算符:`+`和`-`,用于进行加法和减法计算。
7. 移位运算符:`<<`和`>>`,用于按位左移和右移操作。
8. 关系运算符:`<`、`>`、`<=`、`>=`、`==`和`!=`,用于比较两个操作
数的大小关系。
9. 位运算符:`&`、`|`和`^`,用于按位与、按位或和按位异或操作。
10. 逻辑运算符:`&&`和`||`,用于进行逻辑与和逻辑或操作。
11. 条件运算符:`?:`,用于根据条件选择不同的操作。
12. 赋值运算符:`=`, `+=`, `-=`, `*=`, `/=`, `%=`,`<<=`, `>>=`, `&=`, `^=`, `|=`,用于给变量赋值或进行复合赋值操作。
需要注意的是,如果表达式中有多个操作符,可以通过使用括号来改变操作符的优先级。
c语言运算符优先级
小等大等、等等不等,
八位与,七位异,六位或,五与,四或,三疑,二赋,一真逗。
其中“,”号为一个等级分段。
运算符优先级等级注释
“圆方括号、箭头一句号”指的是第15级的运算符。其中圆方括号很明显“()、[]”,箭头 指的是指向结构体成员运算符“->”,句号 指的是结构体成员运算符“.” ;
“五与,四或”指的是第5级、第4级的逻辑与运算符“&&一真逗”指的是第3级到第1级的运算符。其中,三疑指的是条件运算符“?:” (三有双重含义:即指优先级别是三,它的运算符类型也是三目,疑也取“?”之意),二赋 指的是赋值运算符=、+=、-=、*=、/=、%=、>>=、<<=、&=、^=和|= ,一真逗 指的是第1级的“,”运算符,真字只是为了语句需要罢了。
在条件运算符中。如a?b:c;先判断a的值,再根据a的值对b或c之中的一个进行求值。
赋值表达式则规定先对右边的表达式求值,因此使 a = b = c = 6;成为可能。
[编辑本段]运算符优先级等级口诀及注释
运算符优先级等级口诀
圆方括号、箭头一句号, 自增自减非反负、针强地址长度,
1级优先级 左结合
() 圆括号
[] 下标运算符
-> 指向结构体成员运算符
. 结构体成员运算符
2级优先级 右结合
! 逻辑非运算符
~ 按位取反运算符
++ 前缀增量运算符
-- 前缀增量运算符
+ 正号运算符
- 负号运算符
跟在其后的&&比||高。
接下来的是条件运算符,赋值运算符及逗号运算符。
c语言 运算符优先级
c语言运算符优先级C言运算符优先级是指C语言中表示各种操作和表达式的运算符之间的关系。
在C语言中,运算符优先级的高低决定了表达式的计算顺序。
若不清楚C语言运算符优先级的相关规定,在编写程序时就可能出现不符合预期的结果,因此,了解运算符优先级的规则是学习C语言的必要条件。
C语言中共有27种运算符,它们可以分为4类:单目运算符(unary operators)、双目运算符(binary operators)、三目运算符(ternary operators)和优先级运算符(priority operator),每类运算符又有若干种类型,下面将会给出各类运算符的优先级(仅列出优先级最高的运算符,例外的优先级参见文末):一、单目运算符:1、++、、!、~、+、-二、双目运算符:1、*、/、%2、+、-3、>>4、<=、>、>=5、==、!=6、&7、^8、|9、&&10、||三、三目运算符:1、?:四、优先级运算符:1、()2、[]3、.、->从上面可以看出,C语言中运算符优先级的次序由高到低依次为:++、--、!、~、*、/、%、+、-、>>、<=、>、>=、==、!=、&、^、|、&&、||、?:、()、[]、.、->。
在实际的编程过程中,常常会碰到一些比较复杂的表达式,此时就要按照运算符优先级的规则确定每个表达式里各个运算符的计算顺序,以免出现程序错误。
需要注意的是,在确定优先级时,可能会出现不同优先级的运算符,此时可以使用括号来改变优先级,以便符合程序的预期,而且括号在运算中的优先级是最高的。
另外,在C语言中,可以使用逗号运算符来连接多个表达式,逗号运算符的优先级比较低,它的优先级位于基本的算术运算符和关系运算符之间,它使得多个表达式有一个按照从左到右的顺序逐步计算的功能。
总而言之,C语言运算符优先级是指在C语言编程中,什么运算符的优先级比较高,什么运算符的优先级比较低。
c语言赋值运算优先级
c语言赋值运算优先级在C语言中,赋值运算符是用来给变量赋值的。
在赋值运算中要注意的一个重要问题是赋值运算的优先级,因为一个赋值操作可以包含多个运算符,因此必须清楚地了解每个运算符的优先级。
1.赋值运算符的优先级赋值运算符的优先级是高于大部分运算符的,只有少数一些运算符的优先级比赋值运算符更高。
赋值运算符的优先级是从右往左的。
以下是赋值运算符的优先级从高到低的排列:- =- +=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=例如,下面的语句将变量a赋值为b+c:a =b + c;2.赋值运算符的使用在赋值运算中,左侧的操作数通常是一个变量,而右侧可以是常量、变量、表达式等等。
例如:- a = 10; //将整数值10赋值给变量a- b = a + 5; //将a+5的结果赋给变量b- sum += i; //将i加到sum中,并将sum的值赋给sum此外,可以使用多个赋值运算符或者嵌套赋值运算符来实现复杂的操作。
例如:a =b = 10; //将整数值10赋值给变量a和bc = a + (b = 5); //将整数值5赋值给变量b,然后将a+5的结果赋给变量c注意,在使用赋值运算符时要避免将赋值运算符和比较运算符搞混。
例如:if (a = 0) //错误的写法,将a赋值为0并返回0,if判断为假if (a == 0) //正确的写法,比较a是否等于03.赋值运算符的类型转换在使用赋值运算符时,可能会涉及到类型转换的问题。
例如,将一个整数赋值给一个浮点数变量时,会将整数自动转换为浮点数。
float f;int i = 10;f = i; //将整数值10转换为浮点数并赋值给变量f同理,在将一个浮点数赋值给一个整数变量时,会将浮点数自动截断为整数。
int i;float f = 3.14;i = f; //将浮点数值3.14截断为整数3,并赋值给变量i但是,在将一个高精度的数据类型赋值给一个低精度数据类型变量时,可能会出现精度丢失的问题。
c语言算术运算符 关系运算符 逻辑运算符优先级
C语言算术运算符、关系运算符和逻辑运算符优先级详解一、算术运算符1.1 加法运算符(+)加法运算符用于对两个数进行相加操作,例如:a + b。
在C语言中,加法运算符的优先级较低。
1.2 减法运算符(-)减法运算符用于对两个数进行相减操作,例如:a - b。
和加法运算符一样,减法运算符的优先级也较低。
1.3 乘法运算符(*)乘法运算符用于对两个数进行相乘操作,例如:a * b。
在C语言中,乘法运算符的优先级比加法和减法运算符高。
1.4 除法运算符(/)除法运算符用于对两个数进行相除操作,例如:a / b。
和乘法运算符一样,除法运算符的优先级比加法和减法运算符高。
1.5 取模运算符()取模运算符用于求两个数相除后的余数,例如:a b。
在C语言中,取模运算符的优先级和乘法、除法运算符相同。
二、关系运算符2.1 等于运算符(==)等于运算符用于判断两个数是否相等,例如:a == b。
在C语言中,等于运算符的优先级较低。
2.2 不等于运算符(!=)不等于运算符用于判断两个数是否不相等,例如:a != b。
和等于运算符一样,不等于运算符的优先级较低。
2.3 大于运算符(>)大于运算符用于判断一个数是否大于另一个数,例如:a > b。
在C语言中,大于运算符的优先级较低。
2.4 小于运算符(<)小于运算符用于判断一个数是否小于另一个数,例如:a < b。
和大于运算符一样,小于运算符的优先级较低。
2.5 大于等于运算符(>=)大于等于运算符用于判断一个数是否大于或等于另一个数,例如:a >= b。
在C语言中,大于等于运算符的优先级较低。
2.6 小于等于运算符(<=)小于等于运算符用于判断一个数是否小于或等于另一个数,例如:a <= b。
和大于等于运算符一样,小于等于运算符的优先级较低。
三、逻辑运算符3.1 逻辑与运算符()逻辑与运算符用于判断多个条件是否同时成立,例如:(a > 0) (b < 10)。
c语言中移位和类型转换优先级
在C语言中,移位和类型转换的优先级取决于它们的语法结构和上下文。
移位运算符(<<、>>)和类型转换运算符(强制类型转换、隐式类型转换)在优先级上都是低于算术运算符和关系运算符的。
这意味着在复杂的表达式中,它们通常会先被处理。
以下是C语言运算符优先级的一个简略列表(从高到低):
1. 后缀运算符(例如函数调用、数组下标、后缀自增/自减)
2. 前缀运算符(例如前缀自增/自减、一元运算符)
3. 乘法、除法、模运算符
4. 加法、减法、位移运算符
5. 关系运算符(例如<、>、<=、>=)
6. 等于运算符(==、!=)
7. 按位与运算符(&)
8. 按位异或运算符(^)
9. 按位或运算符(|)
10. 逻辑与运算符(&&)
11. 逻辑或运算符(||)
12. 三元运算符(? :)
13. 赋值运算符(=、+=、-=等)
14. 逗号运算符(,)
请注意,这只是一个大致的列表,并且有一些特殊情况和复杂的表达式可能不遵循这个顺序。
在实际编程中,当你不确定时,可以使用括号来明确表达式的运算顺序。
c语言中运算符的优先级
c语言中运算符的优先级
C语言中的运算符按照优先级进行计算,优先级高的运算符先于优先级低的运算符进行计算。
在表达式中,使用括号可以改变运算符的优先级。
下面是C语言中常见的运算符按照优先级从高到低的顺序:
1. 括号:括号可以改变运算符的优先级,括号内的表达式先于括号外的表达式进行计算。
2. 一元运算符:一元运算符包括取正、取负、递增和递减运算符。
它们的优先级相同,从右到左结合。
3. 算术运算符:算术运算符包括加法、减法、乘法、除法和取余运算符。
它们的优先级相同,从左到右结合。
4. 关系运算符:关系运算符用于比较两个值的大小。
包括大于、小于、大于等于、小于等于、等于和不等于运算符。
关系运算符的优先级相同,从左到右结合。
5. 逻辑运算符:逻辑运算符用于组合多个条件。
包括逻辑与、逻辑或和逻辑非运算符。
逻辑非运算符的优先级最高,其次是逻辑与运算
符,最后是逻辑或运算符。
6. 位运算符:位运算符用于对二进制数进行位级操作。
包括按位与、按位或、按位异或和取反运算符。
位运算符的优先级相同,从左到右结合。
7. 赋值运算符:赋值运算符用于将一个值赋给一个变量。
赋值运算符的优先级从右到左结合。
8. 逗号运算符:逗号运算符用于将多个表达式组合在一起,并按照顺序计算这些表达式。
逗号运算符的优先级最低,从左到右结合。
在编写复杂的表达式时,了解运算符的优先级可以帮助程序员正确理解表达式的计算顺序。
同时,使用括号可以明确指定运算的顺序,提高代码的可读性和可维护性。
c语言中赋值运算符与比较运算符的优先级
c语言中赋值运算符与比较运算符的优先级C语言中赋值运算符与比较运算符的优先级在C语言中,赋值运算符和比较运算符是两种常见的运算符。
它们在程序中的使用频率非常高,因此了解它们的优先级是非常重要的。
本文将从赋值运算符和比较运算符两个方面来介绍它们的优先级。
一、赋值运算符的优先级赋值运算符是将右侧的值赋给左侧的变量,它的优先级比较低,因此在表达式中通常需要加上括号来明确优先级。
下面是赋值运算符的优先级从高到低的顺序:1. (),[],->,.,++,--2. !3. ~4. *,&5. *,/,%6. +,-7. <<,>>8. <,<=,>,>=9. ==,!=10. &11. ^12. |13. &&14. ||15. ?:需要注意的是,赋值运算符的优先级比较低,但是它的结合性是从右向左的。
例如,a = b = c的执行顺序是先将c赋值给b,然后将b的值赋给a。
二、比较运算符的优先级比较运算符是用来比较两个值的大小关系,它的优先级比较高,因此在表达式中通常不需要加上括号。
下面是比较运算符的优先级从高到低的顺序:1. ==,!=2. <,<=,>,>=需要注意的是,比较运算符的优先级比较高,但是它的结合性是从左向右的。
例如,a < b < c的执行顺序是先比较a和b的大小关系,然后再将结果与c比较。
三、总结赋值运算符和比较运算符是C语言中常用的运算符,了解它们的优先级可以帮助我们编写更加清晰和准确的代码。
在使用赋值运算符时,需要注意它的优先级比较低,但是结合性是从右向左的;在使用比较运算符时,需要注意它的优先级比较高,但是结合性是从左向右的。
在编写表达式时,可以根据需要加上括号来明确优先级,以避免出现不必要的错误。
总之,掌握赋值运算符和比较运算符的优先级是C语言编程的基础,希望本文能够对读者有所帮助。
c语言中加减乘除的先后顺序
c语言中加减乘除的先后顺序
在C语言中,加减乘除的先后顺序是由运算符优先级决定的。
常见的运算符优先级从高到低依次是:
1. 括号:用括号可以改变运算的优先级,括号中的表达式最先被计算。
2. 乘除:乘法和除法的优先级高于加法和减法,同级情况下从左到右计算。
例如:3 + 6 / 2 * 4 - 2,先计算6/2得3,然后计算3*4得12,再计算3+12得15,最后减去2得13。
3. 加减:加法和减法的优先级相等,同级情况下从左到右计算。
例如:2 + 3 - 1,先计算2+3得5,再减去1得4。
注意:在同一优先级运算符的运算中,由左至右计算。
当有括号时,先计算括号内的运算。
以上就是C语言中加减乘除的先后顺序,掌握了这个规律,能够更准确地写出程序,避免因运算顺序不当而出现错误。
- 1 -。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言运算符优先级表(由上至下,优先级依次递减)
第一、像() [] -> .之类的理所当然是最优先的,其实它们压根也不算什么运算符了第二、除了上面的四种运算符之外,接下来就是单目运算符,也就是! ~ ++ -- - (type) * & sizeof 了。
记住它们的顺序可是自右向左啊!其实结合实例是很容易理解的,比如i++等。
第三、跟着就是双目运算符了,也是C语言运算符优先级中最容易让人混淆的地方了。
其实也没有那么可怕,你认真观察就会发现。
在双目运算符中,算术运算符优先级最高,然后是移位运算符,接着是关系运算符,再着是逻辑运算符。
不过这边需要说的是,在关系运算符中,< <= > >=比== !=的优先级来得高。
此外,在逻辑运算符中,与运算又比或运算优先级来得高,异或则处于二者之间。
同样的,你可以类比出&&与||的优先级关系. 第四、在双目操作符之后,就是三目操作符了,没有什么好说的了。
第五、然后是赋值操作符,你也许会把赋值操作符与三目运算符的优先级搞混。
没有关系,我想你一定写过这样的语句(如果没有,
请你记住!):max = (a>b)?a:b; ,从这个语句里,你就不难记住赋值运算符为什么比三目运算符的优先级低了!第六、逗号运算符是分割各个子语句的(感觉这么说有点不准确,不过我想大家会明白我的意思的),自然优先级最低了,我想这个应该不是很容易混淆的。
总结一下,按运算符优先级从高到低:单目运算符->双目运算符->三目运算符->赋值运算符->逗号运算符特别在双目运算符中,按运算符优先级从高到低:算术运算符->移位运算符->关系运算符(其中== 和 !=优先级又较低)->逻辑运算符(按位与-〉按位异或-〉按位或-〉逻辑与-〉逻辑或)!
运算符的结合性指同一优先级的运算符在表达式中操作的组织方向, 即: 当一个运算对象两侧运算符的优先级别相同时, 运算对象与运算符的结合顺序, 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。
例7 设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语言表达式时, 首先应按优先级进行运算, 然后在同一优先级中按结合方向进行运算。