如何使用符号+ =,* =, - =

时间:2010-07-27 15:47:42

标签: c#

这些操作数可能很简单,但找到明确和完整的解释的困难促使我提出。什么是包含操作数后跟等号的字符组合(例如* =, - =,+ =等),它们做了什么以及它们如何有用(特别是与非数字字段有关)?

非常感谢示例和定义。

由于

8 个答案:

答案 0 :(得分:11)

他们通常大致解释为:

x += y    ===    x = x + y

(等您选择的运营商)

<强>然而;某些语言允许你有一个定制的+ =运算符*,或者在某些情况下可能会有不同的解释;例如,在C#事件中,+ =和 - =分别表示“通过添加访问者订阅”和“通过删除访问者取消订阅”。

通常它们只是节省空间,但在某些情况下 可能是语义上的差异。


* =我的意思是:与+运算符和赋值

非常不同

答案 1 :(得分:11)

这里几乎所有答案都说x + = y;是“等同于”“x = x + y;”。

事实并非如此。由于几个原因,它们并不完全相同。

首先,副作用只进行一次。假设你有

class C { public string S { get; set; } }
class D
{
    private static C c = new C();
    static C M()
    {
        Console.WriteLine("hello!");
        return c;
    }
}

正如您所料,下面第一行打印“hello”一次。第二次打印两次。

D.M().S += "abc";
D.M().S = D.M().S + "abc";

其次,类型系统对于复合赋值的工作方式与常规赋值不同。

short b = 1;
short c = 2;
b += c;
b = b + c;

第三条线是合法的。第四行不是;短路加短路是C#中的int,所以b = b + c是非法将int分配给短路。在这种情况下,复合赋值实际上等于b =(short)(b + c);

如果您对此主题感兴趣,我建议您阅读C#规范的第7.17.2和7.17.3节。

答案 2 :(得分:2)

最大的好处是你可以说:

x += y;

而不是更详细:

x = x + y;

有时使用字符串时这很好,因为您可以使用+=将文本附加到现有字符串。

答案 3 :(得分:2)

x += expressionx = x + (expression)大致相同。换句话说,它计算右侧,然后将+运算符应用于左侧和结果,然后将结果分配回左侧。

就个人而言,我不是他们的忠实粉丝。 /=运算符我发现了一个特殊的威胁,因为有许多与Pascal相关的语言用它来表示布尔不等式。熟悉那些混淆并尝试在C中使用它的人最终会编译代码,从而产生一些可想象的最奇怪的错误。

然而,当左手边有点大的时候,它们确实非常方便,所以重复它会比启蒙更多的噪音。

答案 4 :(得分:1)

假设你有x = 5。如果要将x添加1,可以通过多种方式执行此操作:

x = x + 1; x += 1; x++; ++x;

它们都是等价的,选择其中任何一个都应该将x留给6。

所以基本上,如果你想从x乘以,除或减,只需将+运算符改为你想要的。


抱歉,我没有看到您提到的非数字字段。在C#和C ++中,您可以执行一个称为“运算符重载”的操作,以使非数字对象能够将这些复合运算符与用户定义的函数和/或比较结合使用。

例如,字符串通常被视为对象而不是原始数据类型,但如果执行String s = "hello"; s += "!";,您将看到s将包含hello!。这是因为String对象有一个重载的+ =运算符,它将追加 rvalue "!" - + =运算符的右侧)应用于左值"hello" - + =运算符左侧。

关于C#运算符重载的相关问题: Simple way to overload compound assignment operator in C#?

答案 5 :(得分:1)

这些是复合赋值运算符。对于数字字段,它们被定义为添加(+=),乘以(*=),并从右侧的变量中减去(-=)右边的值,并且将结果分配给左侧的变量。

然而,C ++支持“运算符重载”。意思是,对于任何给定的对象,程序员可以定义如果您编写x += 12会发生什么,而x碰巧是Foo类型的对象而不是int。这通常用于字符串类,因此如果s1 = "All this"您可以编写s1 += " and more",结果将是"All this and more"

答案 6 :(得分:1)

如果您想要解释,请尝试像已经建议的人那样阅读http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Compound-assignment_operators,基本上a += b;相当于a = a + b;。这是使代码更容易编写和读取的简写。

以下是一些例子:

/* Print all evens from 0 through 20 */
for(i = 0; i <= 20; i += 2){
    printf("%d\n", i);
}

/* Slow down at a linear pace */
/* Stop after speed is 0.1 or less */
while(speed > 0.1){
    speed /= 1.2;
}
speed = 0;

那些应该解释一下。它适用于按位运算和算术运算,但我不能想到任何简单的用法,我不想让你迷惑。有一个旧的无临时交换技巧 - a ^= b ^= a ^= b; - 它将交换a和b的值,而不必创建一个临时变量,但我不确定你是否知道按位XOR运算是什么点,所以不要读它。

答案 7 :(得分:0)

关于非数字字段:运算符的作用完全是任意的。在C / ++ /#中,您可以覆盖运算符的作用,允许您编写类似的内容:

MyObj += MyOtherObj;
// MyObj is now null

当重载操作符时,你可以真正做任何你想做的事。