首页 百科知识 逻辑运算中各运算符的优先顺序

逻辑运算中各运算符的优先顺序

时间:2022-10-16 百科知识 版权反馈
【摘要】:一个变量或者常量就是最简单的算术表达式;使用算术运算符和圆括号将算术表达式连接得到新的算术表达式,算术表达式必须符合C语言的语法规则。C语言中提供了两个特殊的算术运算符:自增运算符++和自减运算符--。2)++和--是单目运算符,其优先级高于基本的算术运算符,与取负运算符的优先级相同。

2.4.1 算术运算符和算术表达式

1.基本算术运算符

在C语言中,基本算术运算符有5个,它们是:

 + (加法运算符,或正值运算符,如13+50、+50);

 − (减法运算符,或负值运算符,如50−32、−32);

 * (乘法运算符,如13*8);

 / (除法运算符,如23/4);

 % (取模运算符,或称求余运算符)。

使用基本算术运算符应注意:

1)两个整数相除,结果仍为整数(商向下取整),如20/3的结果为6,5/6的结果为0。但是,如果除数或被除数中有一个为负值,则舍入的方向是不固定的。例如,−5/3,有的机器上得到结果−1,有的机器得到结果−2。多数机器采取“向零取整”的方法,即取整后向零靠拢。

如果参加+、−、*、/运算的两个数中至少有一个数为浮点数,则运算结果是double型数(为自动转换后所有数都按double型进行运算。关于数据类型的转换将在2.5节中详细介绍)。

2)取模运算符%进行余数运算,两个操作对象都必须是整数。结果的符号与%左边的操作数的符号相同。如20%6的结果为2,−45%8的结果为−5,45%−8的结果为5。

3)减法运算符还可以作为取负运算。如表达式

  -numb*2

中的−就是取负运算符。取负运算符是一个单目运算符。

除取负运算符之外,其他的基本算术运算符都是双目运算符,都需要两个操作数。

2.算术表达式和算术运算符的优先级与结合性

一个变量或者常量就是最简单的算术表达式;使用算术运算符和圆括号将算术表达式连接得到新的算术表达式,算术表达式必须符合C语言的语法规则。例如,

  i*j/k−20.9+'d'

是合法的C算术表达式。而

  numb**item、2*(numb-100

不是合法的C算术表达式。

通过算术运算可以得到基本算术表达式的值。

算术表达式中可能包括多个基本算术运算符,需要按照运算符的优先级和结合性决定运算的顺序。

C语言规定了运算符的优先级和结合性。在表达式求值时,按运算符的优先级高低次序执行;若优先级相同,则按照结合性规则执行。

在C语言中,每个运算符都有一个与之相关的优先级别。如果不同级别的多个运算符同时出现在一个表达式中,那么,具有较高优先级的运算符首先得到计算。即:按优先级从高到低的顺序依次执行。可以使用()强制修改运算符的优先级。

基本算术运算符的优先级次序如图2.4.1所示。

img61

图2.4.1 优先级次序

例如,表达式

  −i−j*k

i的左侧的−表示的是取负运算符(不是减法运算符,因为−号前没有操作数)。根据算术运算符的优先级顺序,该表达式相当于

  (−i)−(j*k)

如果运算符的优先级别相同,如m−n+a,则按结合性处理。

C规定了各种运算符的结合性(同一优先级运算符的运算先后次序),算术运算符的结合方向为:自左至右,因此n先与减号结合,执行m−n的运算,再执行与a的运算。自左至右的结合性又称为左结合(性)。

C语言允许混合运算(参加运算的两个操作数的类型不一致),则需要(自动地)进行类型转换,使两个操作数的类型相同,再进行运算。具体内容请参考2.5节。

3.自增、自减运算符

C语言中提供了两个特殊的算术运算符:自增运算符++和自减运算符--。作用是使整型变量的值增1或减1,它们都是单目运算符,可以出现在变量的前面或后面。出现在变量前面,如++i,--i,称为前缀形式;出现在变量后面,如i++,i--,称为后缀形式。

表达式++i和i++的作用都相当于i=i+1,表示将i的内容在原来的基础上加1。

表达式--i和i--的作用都相当于i=i−1,表示将i的内容在原来的基础上减1。

表达式++i 将i的值加1; ++i整个表达式的值为i加1后的值,即先将i的值加1,后使用i(的值)。

表达式i++ 将i的值加1;但i++整个表达式的值为i(原来)的值,即先使用i(的值),再将i的值加1。

--i和i--类似,只不过是做减1运算。

如果i的原值等于51,则执行下面的赋值语句:

1)j=++i;  (i的值先加1变为52,再赋予j,j的值为52)

2)j=i++;  (先将的i值赋予j,j的值为51,然后i再加1变为52)

如果直接在表达式++i和i++的后面加上分号构成C的表达式语句,则前缀和后缀并无区别,都是使i的值在原来基础上加1(--符号也一样)。

使用自增运算符和自减运算符时,需注意几点:

1)自增运算符++和自减运算符--,只能用于变量,而不能用于常量或表达式。如

  55++

  (i+j)++

都是不合法的。

2)++和--是单目运算符,其优先级高于基本的算术运算符,与取负运算符−的优先级相同。其结合方向是“自右至左”。若j的初值为100,表达式

  −j++

等价于

  −(j++)

整个表达式的值为-100,而j变为101。

3)尽量不要在一般的表达式中将自增(减)运算符与其他的运算符混合使用。

4.有关表达式使用中的问题说明

1)ANSI C没有具体规定表达式中的子表达式的求值顺序,允许各编译系统自己安排。

如果a的初值为6,对于表达式

  (a++)+(a++)+(a++)

一些编译系统按照自左至右顺序求解括号,结果表达式相当于6+7+8,即21。而一些编译系统(如Turbo C和MS C)将6作为表达式中所有a的值, 3个a相加,得到表达式的值为18。在求出整个表达式的值后实现a自加3次,a的值变为9。

应该避免出现这种歧义性。如果期望得到21,可以写成下列语句:

  a=6;

  i=a++;

  j=a++;

  k=a++;

  d=i+j+k;

执行完上述语句后,d的值为21,a的值为9。虽然语句多了,但不会引起歧义(与编译系统无关),有利于程序的移植。

2)C编译系统在处理表达式时,尽可能多地自左至右将若干个字符组成一个运算符(在处理标识符、关键字时也按同一原则处理),如a+++b,系统理解为(a++)+b。

3)在调用函数时,多数编译系统对函数参数的求值顺序是自右至左。如a的初值为90,则输出函数的调用:

  printf("%d,%d",a,a++);

输出

91,90

  printf函数输出两个表达式的值:先求出第2个表达式a++的值90(a未自加时的值),再求第1个表达式的值,由于在求解第2个表达式a++后,使a加1变为91,因此printf函数中第一个参数a的值为91。而有的编译系统按自左至右求值,输出

90,90

注意:虽然计算顺序可能不同,但输出数据的顺序是按照表达式的顺序输出的,顺序是一致的。为避免歧义,可以改写为

  b=a++;

  printf("%d,%d",b,a);

输出

  90,91

4)如果一个表达式的操作数都是常量,称为常量表达式。如 10*20、2*3.14等。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈