因为“x+=x-=x*x”这个表达式中含有赋值运算符,而赋值操作符是向右结合。所以先执行x -= x*x,然后再执行:x+=x,如x = 5 ,那么x -= x*x = 5-25= -20 x += x = -20 -20 = -40 的结果为-40。
在一个表达式中可能包含多个有不同运算符连接起来的、具有不同数据类型的数据对象;由于表达式有多种运算,不同的结合顺序可能得出不同结果甚至出现错误运算错误,因为当表达式中含多种运算时,必须按一定顺序进行结合,才能保证运算的合理性和结果的正确性、唯一性。
扩展资料
每种同类型的运算符都有内部的运算符优先级,不同类型的运算符之间也有相应的优先级顺序。一个表达式中既可以包括相同类型的运算符,也可以包括不同类型的运算符或者函数。当多种运算符出现在同一个表达式中时,应该先按照不同类型运算符间的优先级进行运算。
各种运算符间的优先级如下:数值运算符、字符串运算符、关系运算符、逻辑运算符。可以用括号改变优先级顺序,使得括号内的运算优先于括号外的运算。对于多重括号,总是由内到外强制表达式的某些部分优先运行。括号内的运算总是最优先计算。
参考资料来源:
百度百科——赋值运算符
"-="是复合型赋值语句,优先级次于算术运算符的优先级。x-=x+x的意思是x=x-(x+x)。因为"+"的优先级高于"-="的优先级所以x-=x+x 相当于x-=(x+x)也就相当于x=x-(x+x)了。
若执行以下程序则输出 -2
#include <stdio.h>
main ()
{
int x=2
printf("%d\n",x-=x+x)
}
不要解释了,这样的表达式是没有定义的。x += x -= x - x
因为这个表达式尝试在相邻的两个顺序点之间两次改变变量x的值,这个时候编译器的求值顺序是任意的,赋值号左右两边的x的值编译器自己做主,它想选减之前的就选减之前的,想用加之后的就用加之后的!!!楼主,去参考一下C语言里面顺序点的定义以及几种顺序点的作用。这样的表达式不同的编译器可能会给出不同的值。C语言里面规定不能在两个相邻的顺序点之间两次改变同一个变量的值。