++是C++的自增运算符,作用是使变量自加1;--是自减运算符,作用是使变量自减1。++和--有两种用法,一种是前缀用法,一种是后缀用法。前缀用法如:++i、--i ,后缀用法如i++、i--,前缀用法跟后缀用法的差别在于前缀时++i的值为完成i加1后的值,--i为完成i减1后的值。例如:假设i的初值为3,执行cout<<++i<<endl;输出结果为4,而执行cout<<i++<<endl;输出结果为3。--运算符同理。这是世人皆知的常识,我们不再讨论,现在我们来讨论一点有趣的东西,看如下代码:
#include <iostream>
using namespace std;
int main()
{
int i=3;
cout<<(i++)+(i++)+(i++)<<endl;
cout<<i<<endl;
return 0;
}
问,第一次和第二次输出的结果分别是多少?
有人说,是12和6。理由是,表达式从左至右开始计算,因为第一个括号内++运算符是后缀用法,i的初值为3,所以,第一个括号的值是3,计算完第一个括号之后,i自加1,变成4,然后计算第二个括号,第二个括号里的++也是后缀用法,所以,值为4,执行完第二个括号后,i再加1,变成5,接下计算第三个括号,第三个括号里的++也是后缀用法,所以,第三个括号的值为5,然后计算第三个括号相加的和,即3+4+5=12。这个理由看起来不错,似乎应当是这样。然而,运行结果却让人大跌眼镜,竟然是9和6。这是怎么回事呢?说起来也很简单,这是因为很多编译系统规定,在遇到一条计算表达式中同时出现若干i++、i--的情况时,在当前语句中并不执行i的自增和自减,i的初值是多少,i++和i--的值就是多少,当这条表达式执行完成之后,再将i连续自加或自减若干次。
再看如下代码:
#include <iostream>
using namespace std;
int main()
{
int i=3;
cout<<(++i)+(++i)+(++i)<<endl;
cout<<i<<endl;
return 0;
}
问,第一次和第二次输出的结果分别是多少?
有人说,结果应该是4+5+6=15和6。理由我想大家都想明白,我就不多说了。还有人总结了上例的经验,认为,输出结果应该是9和6。我们来运行一下这个程序,看看谁说得对……
好了,运行结果出来了,不过这不是什么好结果,可能很多人看完会抓狂,结果尽然是神鬼莫测的18和6。为什么呢?道理跟上例差不多,那就是很编译系统规定,连续多个前缀式++和--运算符出现在同一个运算表达式中时,先将变量连续自加或自减N次,然后判定++i的值为i+N。
为了验证上面的说法,请看下面的代码:
#include <iostream>
using namespace std;
int main()
{
int i=3;
cout<<(++i)+(i++)+(++i)<<endl;
cout<<i<<endl;
return 0;
}