也论不使用第三个变量交换两个变量的值[C#]
假如有: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#]相关推荐
- php比较两个变量的值_总结PHP不用第三个变量交换两个变量的值的几种方法
"PHP不用第三个变量交换两个变量的值"这个题看到过好多次了,看来面试确实喜欢考这道题.今天,对于这个题目,我自己总结了几种方法,可能不全,大家来互相补充. 有些仅适用于字符串,方 ...
- C++不借助第三变量交换两个变量的值
C++不借助第三变量交换两个变量的值 源代码: #include<iostream> using namespace std; int main(){int x,y;cout<< ...
- 不用额外变量交换两个整数的值
题目 如何不用任何额外变量交换两个整数的值 基本思路 如果给定整数a和b使用如下三行代码即可交换a和b的值: a = a ^ b b = a ^ b a = a ^ b 如何理解这三行代码的具体功能呢 ...
- PHP中不用第三个变量交换两个变量的值
相信大家在PHP面试或者学习中经常会遇到这个问题就是"不用第三个变量来交换两个变量的值",今天正对这个问题来讨论一下: 第一种方法:首先会想到的 这种方法简单可行,顺利的交换了两个 ...
- 不使用第三变量交换两个变量的值
在 Java 中,经常会需要交换两个变量的值,我们一般是使用第三变量完成,比如 temp = a; a = b; b = temp; 这样的写法确实能达成目标,但因此而引入了第三变量,对资源的消耗增加 ...
- 不使用第三个变量交换两个变量的值
小结一下: 给出两个变量:var a = 1, b = 2; 方法一: a = a + b; b = a - b; a = a - b; a, b 的值已经交换. 方法二: a = a ^ b; b ...
- 不用引入第三变量交换两个变量的值
前几天发现了一个问题:有人告诉我,要进行变量交换,就必须引入第三变量! 假设我们要交换a和b变量的值,如果写成 int a=5,b=10; a=b; b=a; 那么结果就是两个都是10,理由不言而喻. ...
- 不借助第三方变量交换两个变量的值(多种方法)
转载自:https://blog.csdn.net/kangkermit/article/details/21371159 通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换.代码 ...
- 不允许创建临时变量交换两个变量的内容
在学习C语言的时候,涉及到两个变量值的交换,其中用到临时变量.如果在没有临时变量的情况下,该如何做呢? 方法一:C语言提供的异或运算就可以实现这样的操作.异或运算符"^"也称&qu ...
- 不使用第三个变量交换两个变量
#include<iostream> using namespace std; int main() { int a,b; cin>>a; cin> ...
最新文章
- Facebook工程师教你什么是随机森林,就算零基础也可以看懂 | 干货
- 21岁华人本科生,凭什么拿下CVPR 2020最佳论文提名?
- 这是我的第一个python程序怎么打-我的第一个Python程序
- 编辑距离:最长公共子序列-LCS问题
- php根据地址获取经纬度
- 2019ICPC南京网络赛A题 The beautiful values of the palace(三维偏序)
- cmake常用语法参考
- android中的MotionEvent 及其它事件处理
- 对称矩阵(MIT课程)
- 在java中获取全年的节假日(包含周末和法定节假日及调休日)
- box-sizing属性介绍
- 快速沃尔什变换学习笔记
- uchar t 单片机C语言的注释是什么,uchar(单片机中uchar是什么意思)
- list.sort() 方法可以用函数作 key 的参数
- 安装Tensorflow 报错false Not creating XLA devices, tf_xla_enable_xla_devices not set
- 同一个磁盘多分区将macOS系统分区向前扩容
- 小文聊天机器人(jquery.chatbot.js)使用指南
- Cannot assign to read only property ‘0’ of string的报错原因之一及解决办法
- 银行外包996,骑驴找马要跳槽
- 【机器学习之模型融合】Voting投票法简单实践
热门文章
- Android入门(三)Activity-生命周期与启动模式
- selenium.common.exceptions.WebDriverException: Message: Can't load the profile.
- 书摘---创业36条军规6:管理的九个问题
- Gradle 配置 BuildConfig详解
- [2018.10.31 T3] 玩
- Luogu4116 Qtree3
- js基础-23-websocket和ajax的区别
- js基础-12-判断数组和判断对象的方法
- 计算机二级C语言判断标准,2012年计算机等级考试二级C语言常见问题:标准输入输出库...
- mysql备份工具命令xtra_mysql xtrabackup备份工具使用