深入理解C语言中的运算符
在大多数语言中,一个表达式只产生一个运算结果,但在C语言中,情况有所不同,我们来看一个例子:j=i++;当i=2时,熟悉C语言的读者马上就会明白计算结果为j=2,i=3,那么计算顺序和何呢?显然先计算的是i++,结果为2。与此同时记录下来i在计算后加1,然后计算j=2。i加1这一运算可以看成计算i++,得到结果2(注意i++的运算结果为2)的付作用。因此在一个表达式中就完成了对两个变量的赋值运算。
2.赋值运算符
在大多数高级语言中,赋值运算都是一种专门的语句,而C语言中等号是一个运算符,与+、-等符号具有相似地位,这就引起了两个问题。
其一是如何理解诸如“j=2;”这样的表示形式。在BASIC语言中无疑这是一个赋值语句,而C语言中它是j=2这个表达式加上分号构成的表达式语句。运算就是计算j=2这个表达式,结果为2,同时的付作用使变量j中的值变为2。计算结果2没有什么意义,故放弃了,这里运算的付作用反而成了人们的主要目的。仔细考虑m=(j=2);就会明白为什么说j被赋值为2是计算中的付作用。
其二是作为运算符的等号与加减等符号有一很大的不 同。加号的两边可为任意的算术表达式,而在等号左边的表达式却不是任意的。如3+2是合法的,而3=2就不合法了。能在等号左边出现的表达式一般被称为左值,左值往往是一个变量,如j=2;也可能是一个通过指针的引用。在一些深入探讨C语言的书中,对左值有较详细的描述。
3.结合性
C语言中的结合性是大多数高级语言所不具备的特点。理解结合性有助于理解C语言中表达式的运算顺序,当你看到一个复杂的C语言表达式时,首先应按运算符的优先级进行运算。只有在几个运算符的优先级完全相同时,才需考虑结合性,以教材附录C中可以看出,具有相同优先级的运算符,其结合性是相同的。下面我们举一个例子来说明这一原则,如m+=n-=---b这里一共有四个运算符,即+=、-=、-、--、显然先应计算---b、--与-的优先级相同,如何理解---b呢:由结合性知它可能是-(--b),也可是--(-b),因为-b作为一个表达式,不能作--的右值(注意,这里的右值,它与左值类似,是++、--!等运算符能作用的表达式),所以只能是-(--b),然后计算的是+=,和-=,它们的优先级相同,结合性为以右到左,所以左先算-=,后计算+=。