案例讲解
#include<iostream>
#include <stdio.h>
int main()
{
int i = 10;
printf("%d\n", ++i);
printf("-----------------\n");
i = 10;
printf("%d\n", --i);
printf("-----------------\n");
i = 10;
printf("%d\n", i++);
printf("-----------------\n");
i = 10;
printf("%d\n", i--);
printf("-----------------\n");
i = 10;
printf("%d\n", -i++);
printf("-----------------\n");
i = 10;
printf("%d\n", -i++);
printf("-----------------\n");
system("pause");
return 0;
}
运行结果:
分析一下,这种问题很简单的,只要是前置加加(或减减),都是先完成自增(减)操作后,再进行下一步操作(在这个案例里面printf打印就是下一步操作);只要是后置加加(或减减),都是先完成下一步操作后,再进行自增(减)操作;如果没有下一步操作等着,那前置和后置就都一样了!
那么,下面再来考虑一个问题,++i和i++那种效率更高呢?
通过上面的例子也可以看出来,如果自增运算表达式的结果,没有被使用,二而仅仅是简单的用于增加一个操作数,那么前缀法和后缀法的效果是一样的,考虑的再仔细点,如果所操作的对象的数据类型是普通的int类型或者是一般的内建数据类型,那效率方面完全没差。
但是,如果所执行的i++,中的i(特别是如果i是一个类的话)是一个自己定义的数据类型呢?前缀式(++i)可以返回对象的引用,而后缀式(i++)必须返回对象的值,会产生较大的复制开销,引起效率降低,所以,导致返回引用的前缀式,肯定效率要高的多。因此,在处理自定义的数据类型白变量的时候,尽量使用前缀式效率更高!
补充:什么是内建的数据类型?答:一般指的是C++中默认的数据类型,比如:int、double、float、char,等等。
经验总结
- 前缀式和后缀式的区别在于,当和其他操作连用的时候,前缀是先执行自增操作,后执行连用的操作;而后缀是正好反过来。
- 前缀式和后缀式的效率区别:1)对于内建的数据类型,效率没有区别;2)对于自定义的数据类型,前缀式的效率更高。
- 前缀式和后缀式效率区别的本质:前缀式返回的是引用,后缀式返回的是值。