听老梁讲了i++、++i后,发现脑子根本不够用,所以自己在gcc上敲了很多相关程序,有了自己的一套理解。希望对有相同疑问的人,提供些许帮助。
int a ;
int i = 2;
1、 碰到 i++(i--) ,先不用管,计算过程中他们对 i 的值没有影响,直至计算结束,有n个 i++(i--),则 i 的值加n。
例如: a =(i++)+(i++)+(i--)+(i++);
结果: a = 8;(2+2+2+2)
i = 4;(2+1+1-1+1)
2、 遇见++i(--i) ,先自增(减),再代入i
例如:a = (++i) + (i++) ; a = (i--)+(++i) ; a = (++i) + (++i)
过程: { { {
(i=3) + i i + (i=3) (i=3) + (i=4)
3 + 3 3 + 3 4 + 4
} } }
结果:a = 6;i = 4 a = 6;i = 2; a = 8; i =4;
3、 加减法运算是从左往右进行的,如果有多个加式,gcc中是先计算前两个的结果,再依次往右计算下去。
例如:a = (++i) + (++i) + (++i) + (++i); a = (i--) + (++i) +(--i)+(i++);
过程: { {
((i=3)+ (i=4)+(++i)+(++i) (i+ (i=3) )+(--i)+(i++)
(4 + 4+ (i=5) )+(++i) (3+3+(i=2) )+(i++)
13 + (i=6) 8 + i
} }
结果:a = 19; i = 6; a = 10; i = 2;
4、 如果加号(减号)右边是个带括号的长式子,需要根据++i(--i)来对i的值进行确定,然后再计算
例如:a =(i++)+((++i)+(i++)); a=(--i)+((i++)+(++i)+i); a=(++i)+( (++i)+(i++)+(++i)+(--i)+i)
过程:{ { {
i + ( (i=3)+ i) (i=1) + (i + (i =2)+ i) (i=3)+( (i=4)+i + ...)
3 + 3 + 3 2 + 2 + 2+ 2 i + ( 8+ (i=5)+...)
} } i + (13 +(i=4)+i)
4+13+4+4
结果: a = 9;i = 5; a = 8; i = 3; a = 25; i = 5;
5、在参数传递中的计算(从右向左)
int fun(int a, int b, int c, int d)
{
printf("%d,%d,%d,%d",a,b,c,d);
}
main()
{
int i = 2;
fun(i,++i,i--,i*10)
}
计算规则是,遇到++i(--i)和i,计算出i的值,用符号i代入括号中,最后用i的值代替。而遇到i++(i--),则先写下其值,再计算i的值代入后面的运算。参数中有运算符,则直接计算代入。
从右向左,2*10; 先赋值,再减1,得i=1 ; 加1,i=2 ; i = 2
过程:原式->fun(i,++i,i--,20) ->fun(i,++i,2,20) ->fun(i,i,2,20)->fun(2,2,2,20)
如果求:fun(i++,i+1,++i,i)->fun(3,4,i,i) ->fun(3,4,4,4)
fun(--i,i,i+0,i++)->fun(i,i,i,2)->fun(2,2,2,2)
所以 ,还是要多加编程练习才能真正理解吧。。