若a为int类型,且其值为3,则执行完表达式a+=a-=a*a后a的值为
答案是-12,标答里说a=a+(a-(a*a)),请问a+中的a值为什么变成-6 展开
a=-12。
按照从左至右结合性和优先级顺序,先计算a-=a*a,最后a结果为a=a-a*a,a=3-3*3=-6;
再计算a+=-6,因为此时a的值已经变成了-6,所以计算过程是a=a+(-6)=-6-6=-12。
优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。表达式的结合次序取决于表达式中各种运算符的优先级。优先级高的运算符先结合,优先级低的运算符后结合,同一行中的运算符的优先级相同。
扩展资料:
C语言中各运算符的结合性分为两种:左结合性和右结合性。
例如:算术运算符的结合性是自左至右,即先左后右。
如有表达式x-y+z则y应先与“-”号结合,执行x-y运算,然后再执行+z的运算。这种自左至右的结合方向就称为“左结合性”。
而自右至左的结合方向称为“右结合性”。 最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z再执行x=(y=z)运算。
C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。
参考资料:
复合赋值表达式,从右到左运行,可以分拆成:
a-=a*a;
a+=a;
a的原值为3
a-=a*a;
相当于
a=a-a*a=3-3*3=-6;
再运行
a+=a;
自然就成了-12
执行(a*a),得值为9,注意此时还未赋值给变量a。
再执行a-=a*a,即 a=a-a*a,亦 a赋值为 3-9,得 a=-6。
后面你就明白了,因为“赋值表达式的结果是最左边赋值运算符左边变量(或者表达式)的值”。执行完赋值表达式(a-=a*a)后,a值为-6, 最后执行 a+= (a-=a*a).
因而 有a= -6 + -6
a=a-(a*a);
a=a+a;
明白吗?