c#中实现两个int变量的数值互换,在借助第三个变量做临时载体的情况下,非常简单。

int a = ;
int b = ;
int c ;
c = a;
a = b;
b = c;

如果不借助第三方变量,有几种实现的方法:

1.异或算法(这种方法不借助第三个变量,也不会产生溢出,比较安全,但仅限整数类型)

int a = ;
int b = ;
a ^= b;
b ^= a;
a ^= b;
Console.WriteLine("{0} {1}", a, b);

2.直接赋值(有溢出的风险???(这里用Int32.MaxValue做测试,没有出现溢出,查看反编译的代码也不会出现溢出,不明白是不是不同的.net版本后台运算过程不一样))

a = a + b - (b = a);

或者(绝对不会出现溢出)

b = a + (a = b) * ;

直接赋值的方法理解了其中的原理,解决的方式可以有很多种,其中的+-*/可以做很多文章。

题外分析上面直接赋值的溢出风险:

贴上a=a+b-(b=a)的反编译代码,帮助理解:

IL_0006:  ldloc.0 //加载索引为0的变量值10到栈顶端
IL_0007: ldloc.1 //加载5到栈顶端
IL_0008: add //提取10和5,执行add运算并将15推送到栈顶端
IL_0009: ldloc.0 //加载10到栈顶端
IL_000a: dup //复制10到栈顶端
IL_000b: stloc.1 //提取栈顶端值赋值给第1个变量
IL_000c: sub //提取当前栈顶端的10和15,做减法,讲5推送至栈顶
IL_000d: stloc.0 //提取栈顶端值赋值给第0个变量

这样来看,唯一有溢出风险的a+b那里,并没有将中间值赋给int类型的任何变量,这样溢出风险也就应该不存在了。

b=a+(a=b)*0;就不做反编译说明了,有兴趣的可以自己看一下,理解一下。

补充:对于有的评论说还可以用“a ^= b ^= a ^= b;”,这里我补充说明这个算式是不能实现互换的,起码.net 4.0的环境下是不行的。详细的另有扩展话题C#连等算式都在做什么

C# 不借助第三个变量实现两整数交换的更多相关文章

  1. Java基础知识强化05:不借助第三个变量实现两个变量互换

    1. 不借助第三个变量实现两个变量互换 代码如下: package himi.hebao; /** * 不借助第三个变量实现,两个变量互换 * 这里利用^异或实现两个变量的互换 * @author A ...

  2. 交换两个变量的值,不借助第三个变量的 三种方法(JS实现)

    第一种:算术运算法 var a = 10; var b = 12; a = b - a; b = b - a; a = b + a; 它的原理是:把a.b看做数轴上的点,围绕两点间的距离来进行计算.具 ...

  3. PHP不借助第三个变量交换值

    总结一下: //方法一: $a = "abc"; $b= "def"; $a = $a^$b; $b = $b^$a; $a = $a^$b; //方法二: l ...

  4. JAVA中两个int类型的变量在不借助第三个变量的情况下完成值的互换

    在面试中被问到这个问题,想到两种解决方式,在此分享一下. 第一种,使用简单的数学运算达到目标(但是面试官往往会问你还有没有其他方式): public static void main(String[] ...

  5. python 交换变量的值 不需要借助第三个变量

    >>> a,b,c,d=1,2,3,4>>> a,b,c,d=d,c,b,a>>> print(a,b,c,d)4 3 2 1>>&g ...

  6. php每天一题:怎么在不使用第三个变量的情况下交换两个变量的值

    $a = 'php'; $b = 'my'; list($a,$b) = array($b,$a); echo $a,$b; 很简单,大家试一下是不是交换了!

  7. 【编程技巧】java不使用第三个变量处理两个变量的交换

    public class SwapNum {public static void main(String[] args) {doSwapNum();}public static void doSwap ...

  8. Java实现两个变量的互换(不借助第3个变量)

    创建一个类,在该类中定义两个变量并为其指定初始值,然后交换两个变量的值,要求不允许借助第三个变量,只能使用异或运行实现两个变量值的交换. import java.util.Scanner; publi ...

  9. 现在有两个变量,分别是a = 3, b = 4,那么我们不用第三个变量来调换a和b的值。

    现在有两个变量,分别是a = 3, b = 4,那么我们不用第三个变量来调换a和b的值. <!DOCTYPE html><html><head>    <me ...

随机推荐

  1. 一个Demo带你彻底掌握View的滑动冲突

    本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发. 近期在又一次学习Android自己定义View这一块的内容.遇到了平时开发中常常碰到的一个棘手问题:View的滑 ...

  2. ADS错误the session file 'C:\user\username\default-1-2-0-0.ses' could not be loaded解决办法

    问题描述:用ADS1.2 + H-JTAG或者是H-Jlink,每次调试的时候都会出现“the session file could not be loaded”这个错误,寻求解决办法?问题解答:用户 ...

  3. Sublime text —— 自定义Color theme

    网上下载,XXX.tmTheme 样式,让后放置于 C:\Users\{用户名}\AppData\Roaming\Sublime Text 2\Packages\Color Scheme - Defa ...

  4. C#基础课程之二变量常量及流程控制

    课堂练习:.一个四位整数 输出它的千位,百位,十位,个位 数字. ; ; % ; % ; ; Console.WriteLine("千位数" + b+" 百位数" ...

  5. java打印条形码Code128C

    生成编码类型为Code128C的条形码的javaCODE: package test; import java.awt.Color; import java.awt.Graphics; import ...

  6. django ---- models继承

    django 中各个models之前可以有继承关系.这种继承关系又可以分成三种情况: 1.简单继承 2.抽象继承 3.代理 一.简单继承: model定义 from django.db import ...

  7. js中表达式 >>> 0 浅析 (以及用php简单翻译)

    今天在看lodash的源码中slice这个函数实现的时候发现了里面有这么一行代码 length = start > end ? 0 : ((end - start) >>> 0 ...

  8. 【Android开发】构建Android源码编译环境

    原文:http://android.eoe.cn/topic/android_sdk 构建Android源码编译环境 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  9. 利用阿里云如何开发一款直播app?

    在开发的过程中应该注意些什么?下面让小编告诉你: 随着互联网的发展,越来越多的人已经加入互联网的行列.而且很多的人也开始直播,和众多的网友分享自己身边事情.互联网还在加速发展,从PC互联网,到移动互联 ...

  10. 使用Xilinx K7 KC705开发板调试PCIe中的问题【持续更新】

    开发板:Xilinx K7 KC705 软件:ISE14.7 1.由于应用需求,我们要将开发板作为主机端,通过PCIe接口转接板外接一个NVMe PCIe SSD.并由FPGA控制SSD的数据读写. ...