加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

运算符的结合性

(2013-06-07 12:21:48)
标签:

it

运算符的结合性指同一优先级的运算符在表达式中操作的组织方向, 即:

 

当一个运算对象两侧运算符的优先级别相同时, 运算对象与运算符的结合顺序。

 

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、例3:

main()
{
  int i=1, j;
  j=i+++i+++i++;
  printf("i=%d,j=%d\n", i, j);
}

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=12 (VC6.0)。分析: 运算符“++”,“+”和“=”的优先级是递减的。在计算时,先进行自增运算,再进行加法运算,最后是赋值运算。而自增运算又根据“ i++ ”和“ ++i ”的不同定义得到不同的值。

i+++i+++i++先将i 原值(1)取出, 作为表达式中i的值进行加法运算得到3, 然后再实现三次自加;

(++i)+(++i)+(++i)的计算相当于“ ++i;++i;++i;k=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。表达式的值为72。

 

例7 设m=1,n=2,b=3,求赋值表达式m+=n-=---b 的值。m+=n-=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,所以表达式的值为5。

当看到一个复杂的C语言表达式时,首先应按优先级进行运算;然后在同一优先级中按结合方向进行运算。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有