arongnet 阅读(879) 评论(11)
++运算符和--运算符最早出现的原因是他是单指令的,因此效率很高,考虑
x = x+1
和x++
前者需要两个mov指令和一个add指令,而后者只需要一个inc指令,在效率至上年代,这是很重要的。

但是,现在的软件都很大,一两个指令的优化对程序基本上没有任何意义。而程序的可维护性和可读性则在大软件中更为重要。由于++运算符和--运算符在复杂表达式中往往受运算顺序影响,其结果是无法预知的,因此现代软件工程往往对这两个指令持反对态度。

考虑常见的国内垃圾考试题,计算a= (b++) + (b--) 的值,这种题目到底结果如何,老实说,即使知道也没有任何意义,因为你根本不应该写出这样的式子。合理的式子应该是:

a = (b+1) + (b-1);
b++;

建议尤其是新学生,把不用++或者--当作一个教条,这样对你只有好处,没有害处。如果一定要用,必须保证一个表达式就是一个变量和++或者--的结合,也就是只能使用如下四种形式:

a++;
a--;
++a;
--a;

评论列表
my12doom
re: 给初学者的建议,不要使用++和--,尤其是复杂的式子
同意一个
徐明刚
re: 给初学者的建议,不要使用++和--,尤其是复杂的式子
有道理
清风雨
re: 给初学者的建议,不要使用++和--,尤其是复杂的式子
批评的试题,我倒是蛮赞同的。

我比较喜欢写
for( int i = 0; i < n; ++i )
if( ++i > n )
if( i++ > n )
while( ++i < n )
while( i++ < n )

我想,它们应该做为你说的四种形式的补充。
周星星
我也说说:
1. ++/-- 是简洁的,正如清风雨所说。
2. ++/-- 是有和+/-不同的特定语义的,比如list的iterator。
Diviner
re: 给初学者的建议,不要使用++和--,尤其是复杂的式子
x=x+1;
x++
我想应该会被编译器优化为一样吧。这么明显的,
清风雨
re: Diviner
一般来说,编译器是会优化,但,你不敢保证编译器都会优化(VC我相信,大多数都是会优化的)。
nscboy
re: 给初学者的建议,不要使用++和--,尤其是复杂的式子
当碰到C++标准没有规定的语意,++和--的表达式不就歇菜了嘛.

以前就++和--这两个中国特色的考试专用运算符在网上查了很多资料.最后得出的结论是,很容易组合出C++标准未定义的表达式来.结果就是:VC6给出一个结果,DevCPP给出另外一个结果.
甚至是debug版本和Release版本的结果都不相同.
由于标准没有规定,所有你还不能说哪个是错的.
所以,感觉这中东西还是少用的好.
标准都没有定义的东西,你自以为分析的再符合逻辑都没有用的.所以现在看到(b++) + (b--) 这一类的表达式就不爽,也许只有我国的课堂上才会有这中无聊的问题.现在碰到这种问题,我一般是建议少用++和--组合这种表达式.万一组合出C++标准未定义的表达式,你分析的再有逻辑性也是错的.
课堂上教这种东西,真是悲哀,比孔已几的回字有几种写法还无聊.
dwdali
re: 给初学者的建议,不要使用++和--,尤其是复杂的式子
确实比较头疼,不过话说回来++/--比x=x+1编译运行的效率是不一样的。在大量循环及表达式简单的情况下还是应该用
feichao
Advice: Use Postfix Operators Only When Necessary
a++ 即是返回 a的值,然后变量 a 加 1,返回需要产生一个临时变量类似于
{
       int temp = a;
       a=a+1;
       return temp;  //返回右值
}
 
++a 则为:
{
    a=a+1;
    return &a;    //返回左值
}
疯子阿虹
re: 给初学者的建议,不要使用++和--,尤其是复杂的式子
To  清风雨 
如果你使用了一个编译器,但是却没有优化
x = x + 1
那就把他丢掉好了:)

对于现在来说,在上个世纪出现的很多种优化条例,
其实在编译器中都会有隐式优化:)
rootlife
re: 给初学者的建议,不要使用++和--,尤其是复杂的式子
++,--,如果会被优化,那么使用++,--,与不使用又有什么区别呢,如果不会被优化,在程序设计的复杂算法里面,若存在大量的计算,我们又怎么能舍弃++,--呢??
如果在内核设计里面用c=c+1的形式来代替c++,inc指令被取代,那么我们还要这条指令有什么用呢??内核设计的宗旨就是简约完美,所以inc指令不该被取代.
正确的建议是:
    1:如果你不懂怎样正确使用++,--,或你不懂编译器对于++,--的操作,那么请尽量使用简洁的++,--运算符,因为c++,c=c+1;
结果是一样的,但前者效率更高.
    2:  如果你对++,--,真的一窍不通,请使用+,-.
    3:如果你不懂编译器的处理方式,请不要谈论++,--.

发表评论
切换编辑模式