c#记两个变量进行值交换
今天腊月二十九啦,无心上班,专注划水.然后就在那里翻帖子消磨时光.
看到了这样一个问题,有人提问为什么 a=b+(b=a)*0
???
第一眼看上去,我也有点蒙,仔细推敲了一下,嗯~的确是交换了值
先把这个等式为什么能交换值先搁置一下,先来总结一下目前我所知道的
两个变量进行值交换有哪些方式?
第一种方式也是最常用的方式:通过中间变量
int a = 1;
int b = 2; int temp = a;
a = b;
b = temp;
第二种方式:通过数学运算
int a = 1;
int b = 2; a = a + b;
b = a - b;
a = a - b;
第三种方式:异或运算
int a = 1;
int b = 2; a = a ^ b; //第一步 001 a值为1 第二步 011 a值为3 第三步 011 a值为3
b = a ^ b; //异或操作 010 b值为2 异或操作 010 b值为2 异或操作 001 b值为1
a = a ^ b; //得到 011 值为3 得到 001 值为1 得到 010 值为2
//这时候a的值为3 这时候b的值为1 这时候a的值为1
这样三步异步操作就完成了换值操作 这也是目前我所知的,不借助中间变量,速度最快的换值,因为异或的运算是位运算,二进制运算
第四种方式在C# 7.0 中可以使用元组(Tuple)类
int a = 1;
int b = 2; (a, b) = (b, a)
这种方式以我的理解 他就像是 new 一个新对象 然后把新对象赋值给旧对象
像这样
public class ClassDemo
{
private int a;
private int b; public int A { get => a; set => a = value; }
public int B { get => b; set => b = value; }
public override string ToString()
{
return "A的值为" + A + " B的值为" + B;
}
}
static void Main(string[] args)
{ ClassDemo oldOBj = new ClassDemo() { A = 1, B = 2 };
Console.WriteLine("旧对象: " + oldOBj.ToString()); ClassDemo newObj = new ClassDemo() { A = 2, B = 1 };
oldOBj = newObj; Console.WriteLine("旧对象: " + oldOBj.ToString());
Console.ReadLine();
}
如果实在不明白(a, b) = (b, a) 这行代码到底什么意思,来看一下反编译之后他是什么样子
这里用IL Spy反编译一下这个控制台程序,如图:

可以看到(a, b) = (b, a)这个操作多出来了两个变量
来分析一下:
这个能交换值当然是因为优先级啦 我们还是先假设
a=1,b=2;
首先,肯定要先算等式右边的,右有又加号,有括号,有乘号, 有等号 那优先级肯定是括号 -> 乘号 -> 然后加号 最后赋值
我看到第一眼是这样推理的
(b=a)先执行 此时b=1 -> 等式右边就是 1+0 -> 然后给a赋值 -> 则结果时a=1,b=1
运行一下代码,结果:

所以我说我第一眼看去有点懵,这是什么操作,Why???
后来,仔细推敲了一下,被自己的愚蠢逗笑了,原来是受到了我亲爱的小学老师先乘除后加减的影响,第一眼看上去就先算乘除去了,实际应该这样推理:
等式右边分两部分b和(b=a)*0做加法 -> 从左往右计算a=2+(b=a)*0 -> 右半部分(b=a)先执行 此时b=1 -> 等式右边就是 2+0 -> 然后给a赋值 -> 则结果时a=2,b=1 ->换值完成
记录一下自己愚蠢的一天.文章中有错误之处希望大佬们不吝赐教,感谢
c#记两个变量进行值交换的更多相关文章
- JavaScript两个变量的值交换的多种方式
前言 该文是在看别人博客的时候发现的,很有趣的一篇文章,这里摘录到自己的简书中,供给各位读者学习本文主要描述,如何不使用中间值,将两个变量的值进行交换.前三种只适用于number类型的数值交换,第四和 ...
- python不使用第三方变量,交换两个变量的值
#不使用第三个变量交换两个变量的值 a=1 b=2 a,b=b,a#python的直接交换 #另一种交换方法 a=a+b#a=3 b=2 b=a-b#a=3 b=1 a=a-b#a=2 b=1 pri ...
- C语言:指针实现交换两个变量的值
用指针交换两个变量的值(10分) 题目内容: 用指针交换两个变量的值 主函数参考: int main( ) { int a,b; scanf("%d%d",&a,& ...
- Python两个变量的值进行交换的方法
Python两个变量的值进行交换的方法 使用第三方变量: '''这是第一种赋值方法,采用第三方变量''' c = a a = b b = c 使用两个变量: '''使用两个变量''' a = a+b ...
- JAVA交换两个变量的值-(不使用第三变量)
以下方法的根本原理就是: 借助第三个变量 c = a; a = b; b = c; 运算符-不借助第三变量: a = a+b; b = a-b; a = a-b; 为运算符-不借助第三个变量: (此种 ...
- 【剑指offer】不使用新变量,交换两个变量的值,C++实现
# 题目 不使用新变量,交换两个变量的值. # 思路 方法一:使用加减法操作,交换两个变量的值. A = A+B B = A-B A = A-B 方法二:使用异或运算,交换两个变量的值 A = A^B ...
- PHP中不用第三个变量交换两个变量的值
相信大家在PHP面试或者学习中经常会遇到这个问题就是“不用第三个变量来交换两个变量的值”,今天正对这个问题来讨论一下: 第一种方法:首先会想到的 这种方法简单可行,顺利的交换了两个变量的值. 第二种方 ...
- python中如何调用函数交换两个变量的值
python中如何调用函数交换两个变量的值 所有代码来在python3.7.1版本实现 以下实例通过用户输入两个变量,并相互交换: 方法一: def swap(a,b): # 创建临时变量,并交换 ...
- JS基础语法---练习:交换两个变量的值
* JavaScript简称为JS * JavaScript是什么? * 是一门脚本语言:不需要编译,直接运行 * 是一门解释性的语言:遇到一样代码就解释一行代码 * C#语言 ...
随机推荐
- 分别使用 Python 和 Math.Net 调用优化算法
1. Rosenbrock 函数 在数学最优化中,Rosenbrock 函数是一个用来测试最优化算法性能的非凸函数,由Howard Harry Rosenbrock 在 1960 年提出 .也称为 R ...
- 【Oracle】10g查看trace生成文件位置及文件名称
select u_dump.value || '/' || db_name.value || '_ora_' || v$process.spid || nvl2(v$process.trace ...
- 记一次centos7重启后docker无法启动的问题
问题描述 在重新了centos7系统后,docker突然就启动不了了,查看报错信息 [root@localhost ~]# systemctl status docker.service ● dock ...
- cursor pin s和cursor pin s wait on x
1.cursor pin s是一个共享锁,一般情况下是因为发生在SQL短时间内大量执行 案例:在生产库中,突然出现大量的cursor pin s的等待,询问是否有动作后,同事说有编译存储过程(被误导了 ...
- Java高并发与多线程(四)-----锁
今天,我们开始Java高并发与多线程的第四篇,锁. 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了. 但是本篇是高并发里面真正的基石,需要大量的理解和 ...
- 从定义到AST及其遍历方式,一文带你搞懂Antlr4
摘要:本文将首先介绍Antlr4 grammer的定义方式,如何通过Antlr4 grammer生成对应的AST,以及Antlr4 的两种AST遍历方式:Visitor方式和Listener方式. 1 ...
- Redis二进制安全
为了便于理解,举一个例子: 在很多编辑器中,都会默认/n是换行字符,也就意味着一串字符存进去,涉及/n都会做一个默认的转义处理,这在编辑语言中,C也有这个特性,例如字符串Hello,\0 World! ...
- 借助 AppleScript 一键打开工作空间
我有个小毛病:同时只能在一个工程里工作. 假如让我开四五个 Webstorm,在工程里 A 改个Bug,然后又到工程 B 里加个需求,再去工程 C 发个版,切来切去一会儿就懵了. 于是有了这个项目:m ...
- redis 代码结构与阅读顺序
https://www.cnblogs.com/aixiaomei/p/6311633.html
- pycharm创建文件夹以及查看源文件存放位置(FOR MAC)
1.首先我们打开pycharm软件,一般首次打开界面如下 2.我们点击creat new project,点击后效果如下,此时创建相应的文件夹 3.创建完成后如下,并可以查看存放文件夹的位置 4.完成 ...