2010-09-25 55 views
2

所以我的朋友给了我一些源代码开始,所以我可以审查和理解它,我有一个问题,但因为他不在线,我认为我会在这里尝试,主要是我不明白这条线。简单的操作员问题。 + =

num += i; 

从本质上讲,这是一样的

num = num + i 

吧?

如果您需要更多的细节请告诉我!我期待很快听到你的回复。

回答

11

从ISO C++ 03(第5.17/7)

The behavior of an expression of the form E1 op= E2 is equivalent to E1 = E1 op E2 except that E1 is evaluated only once.

+0

这是最好的答案,但对我来说最难理解,花了一秒钟的时间才明白你的意思,但我明白了。 – samuraiseoul 2010-09-25 07:05:58

+3

“仅评估一次”可以产生显着差异,例如,如果E1是索引数组位置,其中索引不是常数。例如:arr [random()] = arr [random()] + 1;与arr [random()] + = 1; – 2010-09-25 07:19:18

+0

不错的发现,我不知道这个甚至ISO ISO。谢谢! – 2010-09-25 09:23:02

3

是的。它完全一样(假设你正在谈论内置的+=)。实际上,这是在语言规范中如何定义+=

您最喜爱的C++书籍是否涵盖此主题?

+0

啊,它说同样的事情,我想我匆匆浏览了页面太快,错过了它。 :P谢谢你! – samuraiseoul 2010-09-25 06:47:00

+6

这当然不是一回事,特别是如果num不是原始类型。类可以重载'operator +'和'operator + ='来执行完全不同的操作(这是不明智的,但非常合法)。 – 2010-09-25 06:53:17

+2

@Marcelo Cantos:这就是为什么我添加了“假设你正在谈论内置*'+ ='”位。 C++术语中的“内置运算符”一词专指非重载运算符。对于内置的运算符,它再次与原始示例相同。 – AnT 2010-09-25 06:59:13

3

本质上是的,但它更有效率。对于基本类型,如整数,使用num += i直接递增num的值,而num = num + i创建num的临时值,然后递增,然后将其分配回num

+11

这对任何现代编译器都没有任何影响。 – 2010-09-25 06:51:23

+0

好的,谢谢你的额外信息,我真的很陌生,我只是通过google,以及一些网站和建议去做,所以任何类似的信息都很好理解,现在我知道它做了什么,不同的是,现在并不重要,谢谢你们, – samuraiseoul 2010-09-25 06:54:57

+0

是的,任何现代编译器都应该认识到它们是相同的,GCC编译器在优化时可以做出一些惊人的事情。 – 2010-09-25 06:55:56

0

什么真的会出现,因为之前发布的,依赖于语言。如果假设C++,和num是一个整数,然后为其他人张贴和你有

num += i; 

相当于

num = num + i; 

但它是真的到类,以确定该行为在C++/c#中。您将基本上为num对象调用i对象类型的“+ =”运算符。在一个好的设计中,这应该与首先执行“+”运算符,然后以上述方式执行=运算符相同。但它不一定是:

class foo 
{ 
    bool operator += (int i) {return false;} 
} 

foo num; 
int i; 

bool result = num += i; 

在该示例中,num将保持不变,并且结果将为false。

+1

当超载时,改变运算符的签名/含义确实是不明智的,除非你是当然创建一个DSEL。 – 2010-09-25 10:40:35

+1

@Matthieu M - 毫无疑问。我希望它不会像我所说的那样以任何方式发生。如果一个类使用+ =不是+和=运算符的组合,那么作者有一些'splainin'ta do。 – PatrickV 2010-09-25 19:52:21