background image

}

例 3 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=10(VC6.0)。分析: 

运算符 ++”,“+” “

和 =”的优先级是递减的, 在计算时,先进行自增运算, 再进行加法运算, 

最后是赋值运算。而自增运算又根据 i++” “

和 ++i”的不同定义得到不同的值。i+++i++

+i++先将 i 原值(1)取出, 作为表达式中 i 的值进行加法运算得到 3, 然后再实现三次自加;
 (++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, 所以赋
值表达式的值为 a=72。
例 7 设 m=1,n=2,b=3, 求赋值表达式 m+=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, 所以赋值表达式的值 m=5。
    当看到一个复杂的 C 语言表达式时, 首先应按优先级进行运算, 然后在同一优先级中按
结合方向进行运算。