计算a+=-6的时候,a的值本身就是-6,你不能老拿a的初值代入进去计算呀
如果横式你看不懂,你把它等价成竖式再看
左边:
a=a-a*a;//a初值是3,那么3-9=-6,此时a=-6
a=a+a;//-6+-6=-12
右边:
a=a*a;//a=3x3=9
a=a-a;//此时不管a原来是什么,自己减自己肯定是0呀
a=a+a;//0+0还是0
左右两边最大的区别就是a*a和a*=a的区别
a*a是个表达式,它只计算出一个数供赋值给其他变量,而不改变a本身的值
而a*=a等价于a=a*a,它在计算出a*a的值之后把它赋值回a自身
这个书上说的东西根本是错的
的确,表达式中等号是右结合的,比如说
a=b=c=0
是a=(b=(c=0))
(作为对比,算术表达式在优先级相同的情况下是左结合的,比如a+b+c+d是(((a+b)+c)+d,从左往右)
但是前提是表达式不能是副作用的
a+=a这种表达式,右边的值会因为左边改变而改变的,
在C语言里,是未定义行为
不同的编译器结果不同,根本没有讨论的意义。
此书作者相当无知。
回答:
对于这个问题,我们需要先了解一下什么是复合赋值运算符。
复合赋值运算符是指在赋值的同时进行一定运算的操作,常见的有+=、-=、*=、/=等,表示的是相应的数学运算符和赋值操作的组合,例如a+=3表示a=a+3。但需要注意的是,在进行运算时,运算符两边的表达式也会被计算,因此需要理解操作的执行顺序。
对于左边的a+=-6,实际上相当于a=a+(-6),即a-6。因此,如果a的初始值为0,那么结果为-6;如果a的初始值为3,那么结果为-3。
对于右边的a-=9,实际上相当于a=a-9。因此,如果a的初始值小于9,那么结果为0,因为a不可能为负数;如果a的初始值大于等于9,那么结果为a-9。
为了让chatgpt更好的理解您的问题,可以尝试将问题描述得更加简洁、准确,例如:“希望解释一下复合赋值运算符的执行顺序和计算规则,以及为什么a+=-6和a-=9的结果分别为-6和0?”