C++ 自增自减
由一个基本的例子开始:
int i=0,j;
j=++i;//j=1,i=1
j=i++;//j=1,i=2
前置操作符返回的是加1后的值,返回对象本身;后置操作符返回的是加1前的值,返回值与原操作数相等,后置操作要保存操作数原来的值,代价比较大,一般不采用。
然后关心下printf打印多参数的问题(cout<<问题类似)
例1:void main()
{
int a = 8;
printf("%d %d %d %d\n", a, a++, a--,++a);
printf("%d \n", a);
}
上面的语句在VC6.0中输出为
9 9 9 9
9
例2:void main()
{
int a = 8;
printf("%d %d %d %d\n", a, a++, a--,a--);
printf("%d \n", a);
}
上面的语句在VC6.0中输出为
8 8 8 8
7
流传得很官方的一句话这样解释:其参数计算时按照从右到左压栈,例1比较容易理解,而例2可以认为先将最后一个参数的表达式的值8入栈,再入栈3次,第一个打印语句执行完依次对a进行加1减1减1操作。
int i=0,j;
j=++i;//j=1,i=1
j=i++;//j=1,i=2
前置操作符返回的是加1后的值,返回对象本身;后置操作符返回的是加1前的值,返回值与原操作数相等,后置操作要保存操作数原来的值,代价比较大,一般不采用。
然后关心下printf打印多参数的问题(cout<<问题类似)
例1:void main()
{
int a = 8;
printf("%d %d %d %d\n", a, a++, a--,++a);
printf("%d \n", a);
}
上面的语句在VC6.0中输出为
9 9 9 9
9
例2:void main()
{
int a = 8;
printf("%d %d %d %d\n", a, a++, a--,a--);
printf("%d \n", a);
}
上面的语句在VC6.0中输出为
8 8 8 8
7
流传得很官方的一句话这样解释:其参数计算时按照从右到左压栈,例1比较容易理解,而例2可以认为先将最后一个参数的表达式的值8入栈,再入栈3次,第一个打印语句执行完依次对a进行加1减1减1操作。