首先,这个结果和编译器对于加法运算的结合方式是有关系的,
这里就分析比较常见的右结合的编译器,也就是对于从右向左
进行加法运算的编译器。如果是左结合编译器,结果就不一样了。不论从左向右还是从右向左,处理两次++就要处理+法。
先从左向右分析下面的:
int i=3 ,k
(1) k=(++i)+(++i)+(++i);
(2) k=(++i)+(i++)+(++i);
(3) k=(i++)+(++i)+(++i);
(4) k=(++i)+(++i)+(i++);
(1)int i=3;k=(++i)+(++i)+(++i);
i=3,//i的初值为3
k=(++i)+(++i)+(++i);
先从左向右处理:++i加上++i,处理结果再加上++i
++i //先进行++处理,i的值为4,再将i代入
++i //先进行++处理,i的值为5,再将i代入
所以在执行两次++后,再处理加法,++i加上++i结果为5+5=10
最右边的++i //先进行++处理,i的值为6,再将i代入
所以表达式运算过程中,i的值变为6,最后进行加法运算:6+10=16
(2)先从左向右处理:++i加上i++,处理结果再加上++i
++i //先进行++处理,i的值为4,再将i代入
i++//i的值不变,再处理加法,++i加上i++结果为4+4=8
最右边的++i //先进行++处理,i的值为5,再将i代入
所以表达式运算过程中,最后进行加法运算:8+5=13;
(3) k=(i++)+(++i)+(++i);
先从左向右处理:i++加上++i,处理结果再加上++i,
i++ //先进行++处理,i的值为3,再将i代入
++i//i的值变为4,再处理加法,i++加上++i结果为4+4=8
最右边的++i //先进行++处理,i的值为5,再将i代入
所以表达式运算过程中,最后进行加法运算:8+5=13;
(4) k=(++i)+(++i)+(i++);
先从左向右处理:++i加上++i,处理结果再加上i++,
++i //先进行++处理,i的值为4,再将i代入
++i//i的值变为5,再处理加法,++i加上++i结果为5+5=10;
最右边的i++//先进行++处理,i的值为5,再将i代入
所以表达式运算过程中,最后进行加法运算:8+5=13;
自右向左分析:
(1)int i=3;k=(++i)+(++i)+(++i);
i=3,//i的初值为3
k=(++i)+(++i)+(++i);
先从右向左处理:++i加上++i,处理结果再加上++i
++i //先进行++处理,i的值为4,再将i代入
++i //先进行++处理,i的值为5,再将i代入
所以在执行两次++后,再处理加法,++i加上++i结果为5+5=10
最左边的++i //先进行++处理,i的值为6,再将i代入
所以表达式运算过程中,i的值变为6,最后进行加法运算:6+10=16
(2)先从右向左处理:++i加上i++,处理结果再加上++i
i++ //先进行++处理,i的值不变3,再将i代入
++i//i的值变为4,再处理加法,i++加上++i结果为4+4=8
最左边的++i //先进行++处理,i的值为5,再将i代入
所以表达式运算过程中,最后进行加法运算:8+5=13;
3) k=(i++)+(++i)+(++i);
先从右向左处理:++i加上++i,处理结果再加上i++,
++i //先进行++处理,i的值为4,再将i代入
++i//i的值变为5,再处理加法,++i加上++i结果为5+5=10
最左边的i++ //先进行++处理,i的值不变5,再将i代入
所以表达式运算过程中,最后进行加法运算:10+5=15;
(4) k=(++i)+(++i)+(i++);
先从右向左处理:i++加上++i,处理结果再加上++i,
i++//先进行++处理,i的值不变3,再将i代入
++i//i的值变为4,再处理加法,i++加上++i结果为4+4=8;
最左边的++i//先进行++处理,i的值为5,再将i代入
所以表达式运算过程中,最后进行加法运算:8+5=13;