从交换两个变量值看c语言学习历程

在开始你使用这种方法

int tmp;
tmp = a;
a = b;
b = tmp;

后来你知道了模块化编程,你知道这样是不好的,于是你开始使用函数.

void swap(int *a, int *b);
{
	int tmp;
	tmp = *a;
	*a = *b;
	*b =tmp;
}//下面我就不写函数了

随着c语言的学习,后来你发现下面代码也能完成两变量的值交换的任

x = x +y;
y = x -y;
x = x -y;

后来有一天,你发现你这段代码不是总能正确工作的,因为x + y的值可能一出了啊.

类似的除法和乘法是不是也可以进行这样的交换能

x = x * y;
y = x / y;
x = x / y;

聪明的你很快就发现了,这里隐藏了两个bug.如果x*y = 0怎么办,x*y溢出来怎么办,也就是说只要其中有一个是0就不能处理了,程序还会因为除以0而异常退出.

后来你看到了一串代码

x = x^y;
y = x^y;
x = x^y;

别人说这也能交换值,你不相信,这是什么玩意,异或运算怎么交换两个数的值?是什么原理

下面说说异或运算的几条规律:

1.任何数字与1异或的结果都是这个数字的取反的结果,反之亦然.

例如:

x = x ^ 1;//等价下面语句
	x = ~x;
	原理如下:
	1 = 1 ^ 0; 1 = 0 ^ 1;
	0 = 1 ^ 1;

2.任何数字与0运货算法的结果是他本身,反之亦然.

例如:

x = x ^ 0 ;//等价下面语句
	x = x;
	原理如下:
	0 = 0 ^ 0; 1 = 0 ^ 1;
	1 = 1 ^ 0;

3.一个数异或他自己的结果总是0.

为了加深理解,让我们来写一个小程序:

/*************************************************************************
    > File Name: test.c
    > Author: 傻李
    > Mail: [email protected]
    > Created Time: 2014年11月23日 星期日 11时50分03秒
 ************************************************************************/

#include<stdio.h>
int main()
{
	int x =3,y =4;
	int t;
	printf("(%d,%d)\n",x,y);
	t = x ^ y;
	x = x ^ t;
	y = x ^ t;
	printf("(%d,%d)\n",x,y);
	return 0;
}
int x = 3;
int y = 4;
int tmp;
tmp = x ^ y;
y = t ^ y;//y = (x ^ y) ^ y  ->>  y = x ^ y ^ y  ->> y = x ^ 0; ->> y = x;//此时y的值已经变为x
x = t ^ x; x = (x ^ y) ^ x; ->> x= x ^ x ^ ; x = y;
带入数值来运算一遍:
tmp = 3 ^ 4;
y = tmp ^ y = (3 ^ 4) ^ 4 = 3;
x = tmp ^ x = (3 ^ 4) ^ 3 = 4;

呵呵,tmp = x + y;是不是很像宏呢?你看他只是等价的替换.确实有微妙的相似.

现在不难理解下面代码了吧.

x = x ^ y;
y = x ^ y;
x = x ^ x;

于是下面代码也是不难理解的:

a ^= b ^= a ^= b;//为了防止被乱棍打死,还是不要写这种代码了

好像到了这里,你已经精通交换两变量的各种方法了,实际上路还遥远的很呢,上面所说都只是交换连个整数的例子,遇到ASCII字符还好说,可是如果遇到了浮点数怎么办,结构体怎么办?难道重新写一个函数吗,接下来我们要学习的就是泛型编程了,只有这样,我们写的程序才能以不变应万变.我们的取经之路刚刚开始呢!!!

时间: 2024-10-12 03:59:25

从交换两个变量值看c语言学习历程的相关文章

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

在学习.Net/C#或者任何一门面向对象语言的初期,大家都写过交换两个变量值,通常是通过临时变量来实现.本篇使用多种方式实现两个变量值的交换. 假设int x =1; int y = 2;现在交换两个变量的值. 使用临时变量实现 static void Main(string[] args) { int x = 1; int y = 2; Console.WriteLine("x={0},y={1}",x, y); int temp = x; x = y; y = temp; Cons

不使用临时变量 交换两个变量值

不使用临时变量 交换两个变量值1.$a = $a+$b;$b = $a-$b;$a= $a-$b; 2.list($a, $b) = array($b, $a); 3. $a = $a ^ $b;$b = $a ^ $b;$a = $a ^ $b;

不借助第三个变量,交换两个变量值的3种方式

今天在我们学校的OJ上做题,一道非常简单的题,突然想试试能不能不借助第三个变量,交换两个变量值.蒙出来一半了已经,好可惜.现在把方法写在这里,希望以后不要忘记. 1 void fun1() 2 { 3 int a = 10, b = 100; 4 5 a = a + b; 6 b = a - b: 7 a = a - b; 8 printf("%d\n%d\n", a, b); 9 } 10 11 void fun2() 12 { 13 int a = 10, b = 100; 14

PHP交换两个变量值

方法一:交换两个变量的最简单方法是使用第三个临时变量 1 <?php 2 $a = 15; 3 $b = 27; 4 // 交换逻辑 5 echo "<br>交换前的数字为:<br>"; 6 echo "a =".$a." 且 b=".$b; 7 $temp = $a; 8 $a = $b; 9 $b = $temp; 10 echo "<br>交换后的数字为: <br>"

不使用临时变量交换两个变量值

题目:不使用临时变量交换两个变量值 分析:使用加.减.乘.亦或(aba==b),四种方法分别如下: //方法一:利用加法 int Swap3(int *x, int *y) { *x = *x + *y;//*x是二者和 *y = *x - *y;//*y是*x *x = *x - *y;//*x是*y } //方法二:利用减法 int Swap1(int *x, int *y) { *x = *x - *y;//*x是二者差值 *y = *x + *y;//*x是*y *x = *y - *x

如何不利用一个额外的变量来达到交换两个变量值的目的-------位上的异或运算

问题:一般我们要交换两个变量的值,多会采取一个额外变量来实现,比如temp=a,a=b,b=temp,现在我们能不利用temp来实现交换a,b两个变量值的目的吗? 解决方案:^异或运算符,而且我们会发现a^a=0,还有0^a=a,依据这两条理论,我们可以实现之前提出的问题. 代码如下: #include<stdio.h>void inplace_swap(int * x,int * y){    *y=*x^*y;    *x=*x^*y;    *y=*y^*x;}int main(){  

JavaScript交换两个变量值的七种解决方案

前言 这篇文章总结了七种办法来交换a和b的变量值 1 2 var a = 123; var b = 456; 交换变量值方案一 最最最简单的办法就是使用一个临时变量了,不过使用临时变量的方法实在是太low了 1 2 3 4 var t; t = a; a = b; b = t; 首先把a的值存储到临时变量中,然后b赋值给a,最后拿出临时变量中的a值赋给b,这个办法是最基本的了 交换变量值方案二 下面的方案都不会有临时变量,我总结了一下,其实不使用临时变量的思路都是让其中一个变量变成一个a和b都有

批处理:不用中间变量,交换两个变量值

-------siwuxie095 法一:直接交换(不限) @echo off set var1=abc set var2=123 echo 交换前 :var1=%var1% var2=%var2% set var1=%var2% & set var2=%var1% echo 交换后 :var1=%var1% var2=%var2% pause sublime中: 运行一览: 注意:如果 set var1=%var2% & set var2=%var1% 分开成两段写,就达不到交换的效果了

不使用temp交换两个变量值

方法一:数学方式: a = b - a; b = b - a; a = b + a; 方法二:位运算: a = a ^ b; b = a ^ b; a = a ^ b;