关于C语言中的运算符的优先级和结合性

    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--是先参与运算符,然后再自减了。。。。。。。。。。。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值