为了账号安全,请及时绑定邮箱和手机立即绑定

交换两个变量而不使用临时变量

交换两个变量而不使用临时变量

HUWWW 2019-10-17 15:38:43
我希望能够在不使用C#中使用临时变量的情况下交换两个变量。能做到吗?decimal startAngle = Convert.ToDecimal(159.9);decimal stopAngle = Convert.ToDecimal(355.87);// Swap each://   startAngle becomes: 355.87//   stopAngle becomes: 159.9
查看完整描述

3 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

首先,在C#语言中不使用临时变量进行交换是一个非常糟糕的主意。


但是为了答案,您可以使用以下代码:


startAngle = startAngle + stopAngle;

stopAngle = startAngle - stopAngle;

startAngle = startAngle - stopAngle;

但是,如果两个数字相差很大,则四舍五入会出现问题。这是由于浮点数的性质。


如果要隐藏临时变量,可以使用实用程序方法:


public static class Foo {


    public static void Swap<T> (ref T lhs, ref T rhs) {

        T temp = lhs;

        lhs = rhs;

        rhs = temp;

    }

}


查看完整回答
反对 回复 2019-10-17
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

交换两个变量的正确方法是:


decimal tempDecimal = startAngle;

startAngle = stopAngle;

stopAngle = tempDecimal;

换句话说,使用一个临时变量。


你有它。没有聪明的花招,没有代码的维护者来诅咒您数十年,没有进入The Daily WTF的条目,也没有花费太多的时间试图找出为什么需要一次操作,因为从最低的角度来看,甚至语言最复杂的功能是一系列简单的操作。


只是一个非常简单,易读,易于理解的t = a; a = b; b = t;解决方案。


在我看来,开发人员尝试使用技巧来“交换变量而不使用临时变量”或“ Duff的设备”,这只是在试图展示它们的聪明程度(并失败了)。


我把它们比作那些阅读粗俗书籍的人,这些阅读纯粹是为了在聚会上显得更加有趣(而不是扩大视野)。


与简单的“临时变量”解决方案(使用算术/布尔运算而不是在汇编级进行简单移动)相比,在其中添加和减去的解决方案或基于XOR的解决方案可读性较低,并且很可能会变慢。


通过编写高质量的可读代码来为自己和他人提供服务。


那是我的怒吼。谢谢收听 :-)


顺便说一句,我很清楚这不能回答您的特定问题(对此我会道歉),但是在SO上有很多先例,人们问过如何做某事,正确的答案是“不要做到”。


查看完整回答
反对 回复 2019-10-17
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

是的,使用此代码:


stopAngle = Convert.ToDecimal(159.9);

startAngle = Convert.ToDecimal(355.87);

对于任意值,此问题更加困难。:-)


查看完整回答
反对 回复 2019-10-17
  • 3 回答
  • 0 关注
  • 581 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信