C# 如何使用符号+;=,*=-=

C# 如何使用符号+;=,*=-=,c#,C#,这些操作数可能很简单,但很难找到明确和完整的解释,这促使我提出疑问。包含操作数后跟等号的字符组合是什么(例如*=、-=、+=,等等),它们的作用是什么,以及它们如何有用(特别是关于非数字字段) 如能提供示例和定义,将不胜感激 谢谢最大的好处是你可以说: x += y; 而不是更详细的: x = x + y; 有时在处理字符串时,这很好,因为您可以使用+=将文本附加到现有字符串。假设您有x=5。如果要将1添加到x,可以通过多种方式执行: x=x+1 x+=1 x++ ++x 它们都是等价的,选

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

如能提供示例和定义,将不胜感激


谢谢

最大的好处是你可以说:

x += y;
而不是更详细的:

x = x + y;

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

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

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

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

所以基本上,如果你想对x进行乘法、除法或减法运算,只需将+运算符改为你想要的


对不起,我没有看到您提到非数字字段。在C++和C++中,你可以做一个叫做“操作符重载”的东西,给非数字对象使用这些用户定义函数和/或比较的复合运算符的能力。 例如,字符串通常被视为对象,而不是基本数据类型,但如果执行
String s=“hello”;s+=“!”,您将看到
s
将包含
您好。这是因为String对象有一个重载的+=运算符,它将带有右值(
“!”
--运算符右侧)的追加到左值(
“hello”
--运算符左侧)

关于C#运算符重载的一个相关问题: 它们通常被广义地解释为:

x += y    ===    x = x + y
(等,供您选择运营商)

然而;某些语言允许您使用定制的+=运算符*,或者在某些情况下可以对其进行不同的解释;例如,在C#events中,+=和-=分别表示“通过添加访问器订阅”和“通过删除访问器取消订阅”

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



*=我的意思是:与仅
+
运算符和赋值非常不同,它们是复合赋值运算符。对于数值字段,它们被定义为从左边的变量中添加(
+=
),乘(
*=
),减去右边的值(
-=
),并将结果分配给左边的变量


<>但是,C++支持“运算符重载”。这意味着,对于任何给定的对象,程序员都可以定义如果您编写
x+=12
并且
x
恰好是
Foo
类型的对象而不是
int
类型的对象时会发生什么。这通常是针对字符串类执行的,因此如果
s1=“All This”
您可以编写
s1+=“and more”
,结果将是
“All This and more”
,关于非数字字段:运算符的操作完全是任意的。在C/++/#中,您可以重写运算符的操作,允许您编写如下内容:

MyObj += MyOtherObj;
// MyObj is now null

重载运算符时,您真的可以随心所欲。

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

就我个人而言,我不是他们的超级粉丝。
/=
操作符我发现了一个特殊的威胁,因为有许多与Pascal相关的语言使用它来表示布尔不等式。熟悉这一点的人,如果把它混为一谈,并试图在C中使用它,最终编译出的代码会产生一些可以想象得到的最奇怪的bug


然而,当左手边有点大的时候,它们确实很有用,所以重复它会发出更多的噪音而不是启示。

如果你想要解释,试着像别人建议的那样阅读,基本上是
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;
/*打印0到20之间的所有偶数*/
对于(i=0;i 0.1){
速度/=1.2;
}
速度=0;

这应该可以解释。它适用于按位运算和算术,但我想不出任何简单的用法,我也不想把你搞糊涂。有一个旧的无温度交换技巧-
a^=b^=a^=b-无需创建临时变量即可交换a和b的值,但我不确定您是否知道此时的按位异或操作是什么,所以现在还不了解它。

这里几乎所有的答案都表明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=(短)(b+c)


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

而维基百科没有帮助吗?这些操作员以多种语言出现,但请选择其中一种进行询问,以便我们能够给出更好的答案并避免标签垃圾邮件。所有这些信息都可以在维基百科或其他参考网站上轻松找到。维基并没有给出最好的示例