在C語言中可以通過建立臨時變量來實現兩個變量的交換,當不允許建立臨時變量時,應該怎樣實現兩變量的交換呢?
假設有兩個變量num1和num2;下面通過兩種方法進行分析。
方法一:利用加減法。具體算法分析如下:
由于 ? ? ? ? ? ? ? ? ??num1+num2-num1=num2;
num1+num2-num2=num1;
則將num1+num2賦給num1;num1-num2賦給num2;num1-num2賦給num1,這樣就可以實現num1和num2兩個數內容的交換。通過相同的思想,我們也可以將加減運算改為乘除運算,但此法存在缺陷。對于不能整除的兩個數,設定的精度不同結果的誤差就不同。
代碼如下:#include
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
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。