C#交换两个int变量值的写法

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(好友验证注明:优快云),虽然不是我自己想出来的方法,但是能帮到别人就好

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值