++ 和 -- 运算(转南老师)
当运算是自加或自减1的时候,C,C++提供了更为优化的运算操作符:++,--。
设整型变量 a,原值为 10。我们已经知道,要实现对其加1,可以有以下两种写法:
方法1: a = a +1;
方法2: a += 1;
我们还知道方法2比方法1好。现在还有方法3,并且是最好的方法。
++a,或者:a++;
也就是说,在只自加1的情况下,代码 a++ 或 ++a 可以生成最优化的汇编代码。
同样,自减1操作也有对应的操作符:--a 或 a--;
设a原值为10,则执行 --a 或者 a--后,a的值都为9。
现在来谈谈 ++a 和 a++ 有什么区别。
在C,C++语言里,++a 和 --a 称为前置运算(prefix),而 a++ 和 a--称为后置运算(postfix)。
如果仅仅是进行前置工或后置运算,那么结果是相同的,这我们已经在前面谈过,我们以++为例:设a为10,则无论是 ++a 或 a++,执行结果都是让a递增1,成为11。
但在有其它运算的复杂表达式中,前置++运算过程是:先加1,然后将已加1的变量参以其它运算。后置++的运算过程是:先用未加1的变量参以其它运算,然后再将该变量加1。
听起来有些绕,我们举些例子看,还是变量a,原来值为10:
例子1:
int b = ++a; //前置++
运算结果:a的值为11,b的值也为11。
计算过程解析:
先计算 ++a,结果a值为11;
然后再计算 b = a;结果b值也为11。
例子2:
int b = a++; //后置++
运算结果:a的值为11,但b的值为10。
计算过程解析:
先计算 b = a;因此,b的值是未加1之前的a,所以为10;
然后再计算 a++,a的值为11。
再举一复杂点的表达式:
int a = 10;
int c = 5;
int b = a++ + c;
执行这些代码,b值为15
倘若换成:
int a = 10;
int c = 5;
int b = ++a + c;
执行这些代码,b值为16;
想一想,为什么?
上在举的是++的例子,对于--操作,其计算顺序的规定一样。
++和--的确能加快运算速度,但它们在前置和后置运算上的微小区别,却很空易让你的代码变得不清晰。更为不好的是,不同的编译器可能会对比有不同的解释,比如VC和BC/CB会对同一代码会有不同的编译结果,造成代码的运行结果也不一样,这是我们应该尽量避免的。所以我们建议在代码尽量不要依赖于前置和后置运算的区别。(尽管它会让你的代码看上去很象“高手”所写)。