在C语言中可以通过建立临时变量来实现两个变量的交换,当不允许建立临时变量时,应该怎样实现两变量的交换呢?
假设有两个变量num1和num2;下面通过两种方法进行分析。
方法一:利用加减法。具体算法分析如下:
由于 num1+num2-num1=num2;
num1+num2-num2=num1;
则将num1+num2赋给num1;num1-num2赋给num2;num1-num2赋给num1,这样就可以实现num1和num2两个数内容的交换。通过相同的思想,我们也可以将加减运算改为乘除运算,但此法存在缺陷。对于不能整除的两个数,设定的精度不同结果的误差就不同。
代码如下:
#include<stdio.h>
int main()
{
int num1=10,num2=20;
num1=num1+num2;
num2=num1-num2;
num1=num1-num2;
/*相同方法:将“+”“-”换成“*”“/”*/
printf("%d %d",num1,num2);
return 0;
}
方法二:利用按位异或法。C语言中异或运算符“^”也称为“XOR”运算符,对于二进制数据它的运算规则是:0^0=0;0^1=1;1^0=1;1^1=1;若参加运算的两个数同号,则结果为0(假);异号时结果为1(真)。
具体算法分析如下:num1^num2^num1=num2;
num1^num2^num2=num1;
则将num1^num2赋给num1;num1^num2赋给num2;num1^num2赋给num1,这样就可以实现num1和num2两个数内容的交换。
例如:两个变量a=2和b=3.
a=2 00000000 00000000 00000000 00000010
b=3 00000000 00000000 00000000 00000011
a=a^b=2^3 00000000 00000000 00000000 00000001
b=a^b=2^3^3 00000000 00000000 00000000 00000010
a=a^b=2^3^2 00000000 00000000 00000000 00000011
此时两个数a,b的内容交换了。
代码如下:
#include<stdio.h>
int main()
{
int num1=35,num2=56;
num1=num1^num2;
num2=num1^num2;
num1=num1^num2;
/*异或,此法优于用加减法或乘除法*/
printf("num1=%d,num2=%d",num1,num2);
return 0;
}
小知识:如何动态求取数组大小?
例如:对于数组不知道其大小,可通过sizeof求其长度。sizeof运算符可以动态计算类型大小,
对于数组a[],它的数组大小可用sizeof(a)/sizeof(a[0]),求取对于整型数组sizeof(a[0])=4。
本文出自 “Scen” 博客,请务必保留此出处http://10741357.blog.51cto.com/10731357/1698983