C语言中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式中,优先级较高的先于优先级较低的进行运算。 而在一个运算量两侧的运算符优先级相同时, 则按运算符的结合性所规定的结合方向处理。 C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z则y应先与"-"号结合, 执行x-y运算,然后再执行+z的运算。这种自左至右的结合方向就称为"左结合性"。而自右至左的结合方向称为"右结合性"。 最典型的右结合性运算符是赋值运算符。如x=y=z,由于"="的右结合性,应先执行y=z再执行x=(y=z)运算。 C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。
下面可以个比较重要的例子:
这个程序中,对P=(i++)+(i++)+(i++)应理解为三个i相加,故P值为15。然后i再自增1三次相当于加3故i的最后值为8。而对于q 的值则不然,q=(++j)+(++j)+(++j)应理解为q先自增1,再参与运算,由于q自增1三次后值为8,三个8相加的和为24,j的最后值仍为8。算术表达式表达式是由常量、变量、函数和运算符组合起来的式子。 一个表达式有一个值及其类型, 它们等于计算表达式所得结果的值和类型。表达式求值按运算符的优先级和结合性规定的顺序进行。 单个的常量、变量、函数可以看作是表达式的特例。
下面我们再分析一个比较不常见的表达式 int i=1,j=2; int y = i+++--j;很多时候我们看到这样的表达式就比较头疼,当然这样的写法可读性是很差的,这里只是作为一个例子,并不提倡这样的写法,其实上面的分析并不复杂,我们只要分析运算符的优先级就可以了。int y = i+++--j;表达式中没有括号之类的优先级比较的运算符,那么我们就从左向右分析。
首先我们分析的应该是i+++,我们可以理解为i+(++)和i(++)+,这里++在右边,那么显然i+(++)这个是错误的++不能对其前面的+进行操作,所以应理解为i(++)+,这里++就是从左向右运算了,那么i应该是先参与运算然后再自增1,i此时的值仍为1,那么剩下的可以理解为 y=i+--j;显然这里只有--的优先级最高了,--j,这里--就是自右向左运算了,j自减后再参与其他的运算,那么j的值为1,那么结果出来了,y=i+j,此时y的值为2,如果改为int y = i+++j--;那么y的值就为3了,因为j--是先参与运算符,然后再自减了。。。。。。。。。。。