在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=2b=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