所以我的朋友给了我一些源代码开始,所以我可以审查和理解它,我有一个问题,但因为他不在线,我认为我会在这里尝试,主要是我不明白这条线。简单的操作员问题。 + =
num += i;
从本质上讲,这是一样的
num = num + i
吧?
如果您需要更多的细节请告诉我!我期待很快听到你的回复。
所以我的朋友给了我一些源代码开始,所以我可以审查和理解它,我有一个问题,但因为他不在线,我认为我会在这里尝试,主要是我不明白这条线。简单的操作员问题。 + =
num += i;
从本质上讲,这是一样的
num = num + i
吧?
如果您需要更多的细节请告诉我!我期待很快听到你的回复。
从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.
是的。它完全一样(假设你正在谈论内置的+=
)。实际上,这是在语言规范中如何定义+=
。
您最喜爱的C++书籍是否涵盖此主题?
啊,它说同样的事情,我想我匆匆浏览了页面太快,错过了它。 :P谢谢你! – samuraiseoul 2010-09-25 06:47:00
这当然不是一回事,特别是如果num不是原始类型。类可以重载'operator +'和'operator + ='来执行完全不同的操作(这是不明智的,但非常合法)。 – 2010-09-25 06:53:17
@Marcelo Cantos:这就是为什么我添加了“假设你正在谈论内置*'+ ='”位。 C++术语中的“内置运算符”一词专指非重载运算符。对于内置的运算符,它再次与原始示例相同。 – AnT 2010-09-25 06:59:13
本质上是的,但它更有效率。对于基本类型,如整数,使用num += i
直接递增num
的值,而num = num + i
创建num
的临时值,然后递增,然后将其分配回num
。
这对任何现代编译器都没有任何影响。 – 2010-09-25 06:51:23
好的,谢谢你的额外信息,我真的很陌生,我只是通过google,以及一些网站和建议去做,所以任何类似的信息都很好理解,现在我知道它做了什么,不同的是,现在并不重要,谢谢你们, – samuraiseoul 2010-09-25 06:54:57
是的,任何现代编译器都应该认识到它们是相同的,GCC编译器在优化时可以做出一些惊人的事情。 – 2010-09-25 06:55:56
什么真的会出现,因为之前发布的,依赖于语言。如果假设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。
当超载时,改变运算符的签名/含义确实是不明智的,除非你是当然创建一个DSEL。 – 2010-09-25 10:40:35
@Matthieu M - 毫无疑问。我希望它不会像我所说的那样以任何方式发生。如果一个类使用+ =不是+和=运算符的组合,那么作者有一些'splainin'ta do。 – PatrickV 2010-09-25 19:52:21
这是最好的答案,但对我来说最难理解,花了一秒钟的时间才明白你的意思,但我明白了。 – samuraiseoul 2010-09-25 07:05:58
“仅评估一次”可以产生显着差异,例如,如果E1是索引数组位置,其中索引不是常数。例如:arr [random()] = arr [random()] + 1;与arr [random()] + = 1; – 2010-09-25 07:19:18
不错的发现,我不知道这个甚至ISO ISO。谢谢! – 2010-09-25 09:23:02