本文说说C++的自增(++)
下面是一道题:
#include<iostream>using namesapce std;
int main()
{
int i=1,j;
printf("%d\n",++i);//(1)
printf("%d\n",i++);//(2)
j=i++;
printf("%d\n",j);//(3)
j=++i;
printf("%d\n",j);//(4)
printf("%d\n",-i++);//(5)
printf("%d\n",-i--);//(6)
i=1;
printf("%d\t%d\n",i++,++i);//(7)
printf("%d\n",i);//(8)
i=1;
cout<<i++<<" "<<++i<<endl;//(9)
cout<<i<<endl;//(10)
return 0;
}
求输出结果。
知识点:
(1)基本的,++i,+在i前,就是先+后用i;i++,+在i后,就是先用i后+,所以,(1),(2)输出2,2。
(2)对于赋值表达式,也是同样道理,所以在(3),j=i++,+在i后:先用i,就是先将i赋值给j,然后在i+1,输出j是3;在(4),j=++i,i在+前:先i+1,然后再用i赋值给j,输出j是5(i在此前已是4)。这里额外说一说,自增运算符(++)和自减运算符(--)只能作用于变量,而不能作用于常量或表达式,例如8++或(x+y)++都是不合法的。
(3)对于“-i++”,首先我们要知道,--和++都是和+,-,*,/,%一样是算术运算符,结合性是自右向左,所以“-i++”应该是-(i++)。那么在(5)前,i=5,所以在-(i++)中,先用i后+,所以是输出-5(因为有负运算符号),然后再++,i就是6了,所以同样道理,在(6)里,先用i,输出-6,再--,i最后是5。
(4)我猜很多人都会错(7)~(10),在许多编译器,包括Visual C++和GCC,在处理流时,都是按自右向左的顺序对各输出项求值。所以,在(7)和(10)里,先处理++i,再处理i++,所以输出的都是2和2。这就是使用自增自减的副作用了。
输出结果: