假如有:int x = 1, y = 2;

方法零:

y = 2;

x = 1;

此方法纯属搞笑。请跳过阅读。

方法一:

x = x ^ y;
y = x ^ y;
x = x ^ y;
此方法网上最常见,用二进制来看很容易理解。

方法二:

x = x + y;
y = x - y;
x = x - y;
主要想说说此方法,因为发现网上到处都说此方法有溢出问题,即:当x + y大于int的最大值时,便会溢出。

没有错,x + y的值大于int的最大值时,的确会溢出,但这不算是个问题。

因为:x + y向上溢出后,后面的两次x - y又会向下溢出,又溢回来了:)

而MSDN也说得很清楚:对于不用任何 checked 或 unchecked 运算符或语句括起来的非常数表达式(在运行时计算的表达式),除非外部因素(如编译器开关和执行环境配置)要求 checked 计算,否则默认溢出检查上下文为 unchecked。

即这种情况下默认是不检查溢出的,如果我们实在担心外部因素,大不了加个unchecked:

unchecked

{

x = x + y;
   y = x - y;
   x = x - y;
}

所以:这个方法也是没问题的。

方法三

x = y + (y = x) * 0;

此方法最简洁,才一句话。

假如x和y是字符串:string x = "x",y = "y";

那么方法一失效

方法二可以改装成:

x = x + y;
y = x.Substring(0, x.Length - y.Length);
x = x.Substring(y.Length);

方法三可以改装成:

x = y + (y = x).Substring(0, 0);

或:

x = y + (y = x) == "" ? "" : "";

如果x和y是object呢?

那么方法一二都失效

方法三的关键点加号“+”在object上不可用,想了半天,没想出很完美的方法,只想出个打擦边球的方法:

x = new object[]{y, y = x}[0];

这个数组临时变量应该也算是第三个变量,所以此方法应该还是不符合题意的。

大家有更好的建议吗?

转载于:https://www.cnblogs.com/zhucai/archive/2010/05/28/exchange-variable.html

也论不使用第三个变量交换两个变量的值[C#]相关推荐

  1. php比较两个变量的值_总结PHP不用第三个变量交换两个变量的值的几种方法

    "PHP不用第三个变量交换两个变量的值"这个题看到过好多次了,看来面试确实喜欢考这道题.今天,对于这个题目,我自己总结了几种方法,可能不全,大家来互相补充. 有些仅适用于字符串,方 ...

  2. C++不借助第三变量交换两个变量的值

    C++不借助第三变量交换两个变量的值 源代码: #include<iostream> using namespace std; int main(){int x,y;cout<< ...

  3. 不用额外变量交换两个整数的值

    题目 如何不用任何额外变量交换两个整数的值 基本思路 如果给定整数a和b使用如下三行代码即可交换a和b的值: a = a ^ b b = a ^ b a = a ^ b 如何理解这三行代码的具体功能呢 ...

  4. PHP中不用第三个变量交换两个变量的值

    相信大家在PHP面试或者学习中经常会遇到这个问题就是"不用第三个变量来交换两个变量的值",今天正对这个问题来讨论一下: 第一种方法:首先会想到的 这种方法简单可行,顺利的交换了两个 ...

  5. 不使用第三变量交换两个变量的值

    在 Java 中,经常会需要交换两个变量的值,我们一般是使用第三变量完成,比如 temp = a; a = b; b = temp; 这样的写法确实能达成目标,但因此而引入了第三变量,对资源的消耗增加 ...

  6. 不使用第三个变量交换两个变量的值

    小结一下: 给出两个变量:var a = 1, b = 2; 方法一: a = a + b; b = a - b; a = a - b; a, b 的值已经交换. 方法二: a = a ^ b; b ...

  7. 不用引入第三变量交换两个变量的值

    前几天发现了一个问题:有人告诉我,要进行变量交换,就必须引入第三变量! 假设我们要交换a和b变量的值,如果写成 int a=5,b=10; a=b; b=a; 那么结果就是两个都是10,理由不言而喻. ...

  8. 不借助第三方变量交换两个变量的值(多种方法)

    转载自:https://blog.csdn.net/kangkermit/article/details/21371159 通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换.代码 ...

  9. 不允许创建临时变量交换两个变量的内容

    在学习C语言的时候,涉及到两个变量值的交换,其中用到临时变量.如果在没有临时变量的情况下,该如何做呢? 方法一:C语言提供的异或运算就可以实现这样的操作.异或运算符"^"也称&qu ...

  10. 不使用第三个变量交换两个变量

    #include<iostream> using namespace std; int main() {     int a,b;     cin>>a;     cin> ...

最新文章

  1. Facebook工程师教你什么是随机森林,就算零基础也可以看懂 | 干货
  2. 21岁华人本科生,凭什么拿下CVPR 2020最佳论文提名?
  3. 这是我的第一个python程序怎么打-我的第一个Python程序
  4. 编辑距离:最长公共子序列-LCS问题
  5. php根据地址获取经纬度
  6. 2019ICPC南京网络赛A题 The beautiful values of the palace(三维偏序)
  7. cmake常用语法参考
  8. android中的MotionEvent 及其它事件处理
  9. 对称矩阵(MIT课程)
  10. 在java中获取全年的节假日(包含周末和法定节假日及调休日)
  11. box-sizing属性介绍
  12. 快速沃尔什变换学习笔记
  13. uchar t 单片机C语言的注释是什么,uchar(单片机中uchar是什么意思)
  14. list.sort() 方法可以用函数作 key 的参数
  15. 安装Tensorflow 报错false Not creating XLA devices, tf_xla_enable_xla_devices not set
  16. 同一个磁盘多分区将macOS系统分区向前扩容
  17. 小文聊天机器人(jquery.chatbot.js)使用指南
  18. Cannot assign to read only property ‘0’ of string的报错原因之一及解决办法
  19. 银行外包996,骑驴找马要跳槽
  20. 【机器学习之模型融合】Voting投票法简单实践

热门文章

  1. Android入门(三)Activity-生命周期与启动模式
  2. selenium.common.exceptions.WebDriverException: Message: Can't load the profile.
  3. 书摘---创业36条军规6:管理的九个问题
  4. Gradle 配置 BuildConfig详解
  5. [2018.10.31 T3] 玩
  6. Luogu4116 Qtree3
  7. js基础-23-websocket和ajax的区别
  8. js基础-12-判断数组和判断对象的方法
  9. 计算机二级C语言判断标准,2012年计算机等级考试二级C语言常见问题:标准输入输出库...
  10. mysql备份工具命令xtra_mysql xtrabackup备份工具使用