}
例 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 语言表达式时, 首先应按优先级进行运算, 然后在同一优先级中按
结合方向进行运算。