Üçüncü değişkeni kullanmadan iki sayıyı değiştirmek için basit bir c örneği görelim.
program 1:
#include<stdio.h>
#include<conio.h>
main()
{
int a=10, b=20;
clrscr();
printf("Before swap a=%d b=%d",a,b);
a=a+b;//a=30 (10+20)
b=a-b;//b=10 (30-20)
a=a-b;//a=20 (30-10)
printf("\nAfter swap a=%d b=%d",a,b);
getch();
}
Çıktı:
Takas öncesi a = 10 b = 20 Takas sonrası a = 20 b = 10
Program 2: * ve / kullanma
* Ve / kullanarak iki sayıyı değiştirmek için başka bir örnek görelim.
#include<stdio.h>
#include<conio.h>
main()
{
int a=10, b=20;
clrscr();
printf("Before swap a=%d b=%d",a,b);
a=a*b;//a=200 (10*20)
b=a/b;//b=10 (200/20)
a=a/b;//a=20 (200/10)
printf("\nAfter swap a=%d b=%d",a,b);
getch();
}
Çıktı:
Takas öncesi a = 10 b = 20 Takas sonrası a = 20 b = 10
Program 3: Bitsel XOR operatörünün kullanılması:
Bitsel XOR operatörü iki değişkeni takas etmek için kullanılabilir. X ve y sayısının XOR'u, x ve y bitlerinin farklı olduğu yerlerde tüm bitleri 1 olan bir sayıyı döndürür. Örneğin, XOR of 10 (In Binary 1010) and 5 (In Binary 0101) is 1111 and XOR of 7 (0111) and 5 (0101) is (0010).
#include <stdio.h>
int main()
{
int x = 10, y = 5;
// Code to swap 'x' (1010) and 'y' (0101)
x = x ^ y; // x now becomes 15 (1111)
y = x ^ y; // y becomes 10 (1010)
x = x ^ y; // x becomes 5 (0101)
printf("After Swapping: x = %d, y = %d", x, y);
return 0;
Çıktı:
Değiştirmeden Sonra: x = 5, y = 10
Program 4:
Henüz kimse std :: swap kullanmayı önermedi.
std::swap(a, b);
Herhangi bir geçici değişken kullanmıyorum ve a ve b'nin türüne bağlı olarak uygulamanın da olmayan bir uzmanlığı olabilir. Uygulama, bir "hile" nin uygun olup olmadığı bilerek yazılmalıdır.
Yukarıdaki yöntemlerle ilgili sorunlar:
1) Çarpma ve bölme tabanlı yaklaşım, sayılardan biri 0 ise, ürün diğer sayıdan bağımsız olarak 0 olurken çalışmaz.
2) Her iki Aritmetik çözüm de aritmetik taşmaya neden olabilir. X ve y çok büyükse, toplama ve çarpma tamsayı aralığının dışına çıkabilir.
3) Bir değişkene işaretçi kullandığımızda ve bir işlev değişimi yaptığımızda, her iki işaretçi de aynı değişkeni gösterdiğinde yukarıdaki yöntemlerin tümü başarısız olur. Her ikisi de aynı değişkeni gösteriyorsa, bu durumda ne olacağına bir bakalım.
// Bitsel XOR tabanlı yöntem
x = x ^ x; // x becomes 0
x = x ^ x; // x remains 0
x = x ^ x; // x remains 0
// Aritmetik tabanlı yöntem
x = x + x; // x becomes 2x
x = x – x; // x becomes 0
x = x – x; // x remains 0
Aşağıdaki programı görelim.
#include <stdio.h>
void swap(int *xp, int *yp)
{
*xp = *xp ^ *yp;
*yp = *xp ^ *yp;
*xp = *xp ^ *yp;
}
int main()
{
int x = 10;
swap(&x, &x);
printf("After swap(&x, &x): x = %d", x);
return 0;
}
Çıktı :
Değiştirmeden sonra (& x, & x): x = 0
Birçok standart algoritmada bir değişkeni kendisiyle değiştirmek gerekebilir. Örneğin, bir değişkeni kendisiyle değiştirebileceğimiz QuickSort uygulamasına bakın. Değişimden önce bir koşul koyarak yukarıdaki sorun önlenebilir.
#include <stdio.h>
void swap(int *xp, int *yp)
{
if (xp == yp) // Check if the two addresses are same
return;
*xp = *xp + *yp;
*yp = *xp - *yp;
*xp = *xp - *yp;
}
int main()
{
int x = 10;
swap(&x, &x);
printf("After swap(&x, &x): x = %d", x);
return 0;
}
Çıktı :
Değiştirmeden sonra (& x, & x): x = 10