++(从右向左运算) >(优先于) +(从左到右运算) >(优先于) =(从右到左运算)
区别:
a++ 是常量
++a 是变量
计算例子一:
int a = 0
a = (a++)+(++a)
步骤1.由于运算符的优先顺序可知先计算=右边,+左边,故先计算a++的值,在计算++a的值
步骤2.计算a++的值,从右向左压栈,++运算符入栈,然后a入栈(此时a为0),栈顶的值是a的值也是返回值为0(a++返回的是常量),然后进行++运算,a为1
步骤3.计算++a的值,从右向左压栈,a入栈(由步骤2可知a为1),然后++入栈,先计算++运算符,此时a为2,然后栈顶的值是a的值也是返回值为2(++a返回的是变量,1变2)
步骤4.计算+运算符,a++返回值为0,++a返回值为2,故最后a的结果是2
计算例子二:
int a = 0
a = (++a)+(a++)
步骤1.由于运算符的优先顺序可知先计算=右边,+左边,故先计算++a的值,在计算a++的值
步骤2.计算++a的值,从右向左压栈,a入栈(由赋值可知a为0),然后++入栈,先计算++运算符,此时a为1,然后栈顶的值是a的值也是返回值为1(++a返回的是变量,0变1)
步骤3.计算a++的值,从右向左压栈,++运算符入栈,然后a入栈(此时a为1),栈顶的值是a的值也是返回值为1(a++返回的是常量),然后进行++运算,a为2
步骤4.计算+运算符,++a返回值为1,a++返回值为1,故最后a的结果是2
练习:
int a = 0
a = (a++)+(++a)+a //4
int a = 0
a = (++a)+(a++)+a //4
int a = 0
a = (a++)+(a++)+a //3
int a = 0
a = (++a)+(++a)+a //5
总结:从右向左计算的运算符,变量都要放在运算符的右边,比如:-(取反),(类型强转),++ ,-- ,*(取值运算),&(取地址运算),! ,~ ,sizeof等