1.使用临时变量
static void Main(string[] args)
{
Console.WriteLine("请输入两个整数x,y");
int x = int.Parse(Console.ReadLine());//使用 int.parse(string s) 将输入的字符串为int值
int y = Convert.ToInt32(Console.ReadLine());//使用Convert.ToInt32(string value) 将输入的字符串转化为int值
Console.WriteLine("x={0},y={1}", x, y);
int temp;//定义一个临时变量temp
temp = x; //将x的值赋给temp
x = y; //将y的值赋给x
y = temp; //将temp存放的x的值赋给y
Console.WriteLine("x={0},y={1}",x,y);
}
知识点:将输入的字符串转化为int值 两种方法:int.Parse(string s)和Convert.ToInt32(string value)。定义一个临时变量temp,将x的值赋给temp,然后将y的值赋给x,然后将temp存放的x的值赋给y;(可以这样理解:相当与一个空杯子、一杯咖啡,一杯牛奶,将牛奶和咖啡交换)
2.使用加减法
static void Main(string[] args)
{
Console.WriteLine("输入两个整数x,y");
int x = int.Parse(Console.ReadLine());
int y = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("x={0},y={1}", x, y);
x = x + y; //将x+y的和的值赋给x
y = x - y; //这个x-y等于x和y的和减去原先y的值剩余原先x的值
x = x - y; //这个x-y等于x+y的和减去y的值(y在上一步已经变成原先x的值),剩余原先的y的值
Console.WriteLine("x={0},y={1}", x, y);
}
思路:将x+y的和的值赋给x(y的值不变)。x减去于原先y的值即为x的值,将这个得到的x的值赋给y。然后x减去上一步得到的y的值(实际上是原先x的值),就得到现在x的值(原先y的值)
如果感觉比较绕口,可以看接下来这个代码块(实际上两者的思路是相同的,不过下面使用了一个临时变量,也是为了好理解吧)
static void Main(string[] args)
{
Console.WriteLine("请输入两个int值的变量");
int x = Int32.Parse(Console.ReadLine()); //这里用的是Int32.Parse(string s)
int y;
if(Int32.TryParse(Console.ReadLine(),out y)){ //这里使用的是Int32.TryParse(string s,out int result) 详情可以参考MSDN
Console.WriteLine("x={0},y={1}", x, y);
}
int temp = x + y; //定义一个临时变量temp用来存放x+y的和的值
x = temp - x; //x就等于temp减去x的值,也就是把y的值赋给x
y = temp - y; // y = temp - x; //y就等于temp减去y的值,也就是把x的值赋给y 也可以写成y=temp-x 因为上一步已经把x的实际值转换为原先的y值,所有temp减去x就是等于原先x的值
Console.WriteLine("x={0},y={1}", x, y);
}
思路:将两者的和存放在一个临时变量中,然后减去其中一个的值得到另一个。在将输入的字符串转换为int值时,尝试用了Int32.parse(string s)和Int32.TryParse(string s,out int result)(此方法返回值为bool值),用法可以参考MSDN
上面是加法的写法,再写一个减法的写法:
static void Main(string[] args)
{
Console.WriteLine("请输入两个整数x,y");
int x = Int32.Parse(Console.ReadLine());
int y = Int32.Parse(Console.ReadLine());
Console.WriteLine("x={0},y={1}", x,y);
x = x - y; //将x比y多的部分赋值给x
y = x + y; //将多的部分x加上原先的y即为原先的x,将其赋值给y
x = y - x; //y也就是原先x的值,减去比y多的那部分值,就是y的值,再将其赋值给x
Console.WriteLine("x={0},y={1}", x, y);
}
思路:x-y;将x比y多的那部分拿出来赋值给x,这个x加上原先的y就是原先的x的值,现在的y的值(也就是原先x的值)减去x比y多的部分(即第一步的x的值),即可得到原先y的值并赋值给x;
3.使用方法(这里注意要用到ref)
static void Main(string[] args)
{
Console.WriteLine("请输入两个整数x,y");
int x = int.Parse(Console.ReadLine());
int y = Int32.Parse(Console.ReadLine());
Console.WriteLine("x={0},y={1}", x, y);
Swap(ref x, ref y); //方法在用一个类时调用 注意要用关键字ref
Console.WriteLine("x={0},y={1}", x, y);
Exchange.Swap(ref x,ref y); //方法在不同类时的调用 注意要用关键字ref
Console.WriteLine("x={0},y={1}",x,y);
}
static void Swap(ref int x, ref int y) //写一个方法,调用方法实现变量交换 这是在同一个类的情况
{
int temp = x;
x = y;
y = temp;
}
class Exchange
{
/// <summary>
/// 写一个方法,调用方法实现变量交换 这是不在同一个类的情况
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public static void Swap(ref int x, ref int y)
{
int temp = x;
x = y;
y = temp;
}
}
ps:这里注意使用方法交换两个变量,要使用ref关键字(不论是形参还是实参)。在同一个类时,要将方法定义为static(静态类),如果不是静态类就会要求有对象引用。在不同类时,除了将类定义为static,还要加上修饰符public(不加的话默认应该是private),不然不能引用该方法。
上面是交换两个Int变量,交换string变量也可以这样写(方法可以重载):
static void Main(string[] args)
{
Console.WriteLine("输入两个string变量");
string a = Console.ReadLine();
string b = Console.ReadLine();
Console.WriteLine("a={0},b={1}", a, b); //交换前
Swap(ref a, ref b);
Console.WriteLine("a={0},b={1}", a, b); //交换后
}
/// <summary>
/// 使用方法实现两个string 变量交换
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
static void Swap(ref string a, ref string b)
{
string temp = a;
a = b;
b = temp;
}
同样的,如果想交换其他类型的变量,可以使用泛型方法:
static void Main(string[] args)
{
Console.WriteLine("随意输出两个同类型的数据");
double c = double.Parse(Console.ReadLine()); //char c = char.Parse(Console.ReadLine());
double d = double.Parse(Console.ReadLine()); //char d = char.Parse(Console.ReadLine());
Console.WriteLine("c={0},d={1}", c, d);
Swap(ref c, ref d); //Swap<char>(ref c, ref d); //泛型方法<T>可以省略 方法会自动识别输入的是何种数据类型
Console.WriteLine("c={0},d={1}", c, d);
}
/// <summary>
/// 使用泛型方法 实现不同数据类型的两个变量进行交换
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="c"></param>
/// <param name="d"></param>
static void Swap<T>(ref T c, ref T d)
{
T temp = c;
c = d;
d = temp;
}
ps:注意泛型方法<T>可以省略,系统会自动识别输入的是何种数据类型
4.使用按位异或运算符交换两个变量
static void Main(string[] args)
{
Console.WriteLine("请输入两个int变量");
int m = int.Parse(Console.ReadLine());
int n = int.Parse(Console.ReadLine());
Console.WriteLine("m={0},n={1}", m, n);
Swap(ref m, ref n);
Console.WriteLine("m={0},n={1}", m, n);
}
static void Swap(ref int x, ref int y)
{
x = x ^ y;
y = y ^ x;
x = x ^ y;
//异或运算交换两个Int变量的原理:
/* 异或运算有如下性质:
* 1.任何一个变量X与其自身进行异或运算,结果为0,即X^X=0
* 2.任何一个变量X与0进行异或运算,结果不变,即X^0=X
* 3.异或运算具有可结合性,即 a^b^c=(a^b)^c=a^(b^c)
* 4.异或运算具有可交换性
* 推理过程:1 a=a^b 2.b=b^a 即可转化为 b=b^(a^b)=a^(b^b)=a^0=a 即将a的值赋给b;
* 3.a=a^b=(a^b)^a=(a^a)^b=0^b=b;
* 注意:当a和b相等时,该方法不适用
* 这个过程等价于:
* a=a+b;
* b=a-b;
* a=a-b;
* 前提是a+b的值不能溢出
*/
}
ps:这里解释一下按位异或运算交换两个变量的原理:
按位异或运算(参与运算的两个值,如果两个相应位相同,则结果为0,否则为1)有以下性质:
1.任意一个变量X与其自身进行按位异或运算,结果为0,即X^X=0
2.任意一个变量X与0进行异或运算,结果不变,即X^0=X
3.异或运算具有可结合性,即a^b^c=(a^b)^c=a^(b^c)
4.异或运算具有可交换性,即a^b=b^a
推理:1.a=a^b 2.b=b^a=b^(a^b)=(b^b)^a=0^a=a;这一步就将a的值赋给了b;3.a=a^b=(a^b)^a=(a^a)^b=0^b=b;这一步将b的值赋给了a
该过程等价与: a=a+b b=a-b a=a-b 前提是a+b的值不能溢出 并且注意 当 a和b的值相等时,该方法不适用;
static void Main(string[] args)
{
Console.WriteLine("请输入两个变量的值a,b");
int a = int.Parse(Console.ReadLine()); //假设a和b 相等 都为 5 即a=5 b=5
int b = int.Parse(Console.ReadLine());
Console.WriteLine("a={0},b={1}", a, b);
a = a ^ b; //a= a^b=5^5=0
b = b ^ a; //b=b^a=b^0=b
a = a ^ b; //a=a^b=0^b=b 两者并没有实现交换
Console.WriteLine("a={0},b={1}", a, b);
}
ps:四种方法的参考链接:https://www.cnblogs.com/darrenji/p/4464799.html
按位异或实现两int变量交换的链接:https://blog.youkuaiyun.com/kybd2006/article/details/3727218
新手上路,有什么不对的,请大家多多指教。有什么探讨的请加QQ:1044930001(好友验证注明:优快云),虽然不是我自己想出来的方法,但是能帮到别人就好