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