Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

การสลับค่าตัวแปรสองตัวโดยไม่ใช้ตัวแปรที่สามใน C/C++

สามารถสลับค่าตัวแปรสองตัวได้โดยไม่ต้องใช้ตัวแปรชั่วคราว (temporary variable) ด้วยเทคนิคทางคณิตศาสตร์หรือ Bitwise XOR

วิธีที่ 1: ใช้คณิตศาสตร์ (Arithmetic Method)

a += b -= a = b - a;

การทำงานทีละขั้นตอน

สมมติ a = 23, b = 43

1. a = b - a    → a = 43 - 23 = 20
2. b -= a       → b = 43 - 20 = 23
3. a += b       → a = 20 + 23 = 43

ผลลัพธ์: a = 43, b = 23 ✓

วิธีที่ 2: ใช้ Bitwise XOR (XOR Swap Algorithm)

(a ^= b), (b ^= a), (a ^= b);

การทำงานทีละขั้นตอน

สมมติ a = 28 (11100), b = 8 (01000)

1. a ^= b  → a = 11100 ^ 01000 = 10100 (20)
2. b ^= a  → b = 01000 ^ 10100 = 11100 (28)
3. a ^= b  → a = 10100 ^ 11100 = 01000 (8)

ผลลัพธ์: a = 8, b = 28 ✓

ตัวอย่างโปรแกรมครบ

#include <stdio.h>

int main() {
    int a = 28, b = 8;
    
    printf("Before Swapping : %d\t%d\n", a, b);
    
    // Method 1: Arithmetic
    a += b -= a = b - a;
    printf("After Method 1  : %d\t%d\n", a, b);
    
    // Method 2: XOR
    (a ^= b), (b ^= a), (a ^= b);
    printf("After Method 2  : %d\t%d\n", a, b);
    
    return 0;
}

ผลลัพธ์

Before Swapping : 28	8
After Method 1  : 8	28
After Method 2  : 28	8

ข้อควรระวัง (Caveats)

  • Arithmetic Method: อาจเกิด Integer Overflow หากผลรวมเกินขอบเขตของชนิดข้อมูล
  • XOR Method: ใช้ได้กับ Integer types เท่านั้น ไม่ได้กับ Float/Double
  • Aliasing Problem: หาก a และ b ชี้ไปที่หน่วยความจำเดียวกัน (same address) XOR method จะทำให้ค่ากลายเป็น 0
  • Readability: โค้ดยากต่อการอ่าน เข้าใจ และบำรุงรักษา

แนวทางปฏิบัติที่แนะนำ

// ใช้ตัวแปรชั่วคราว - ชัดเจน เร็ว และปลอดภัย
int temp = a;
a = b;
b = temp;

// หรือใน C++ ใช้ std::swap
#include <algorithm>
std::swap(a, b);

สรุป: เทคนิคนี้เหมาะสำหรับการสอบ/สัมภาษณ์หรือ embedded systems ที่ memory จำกัดมาก แต่ในการพัฒนาจริง ควรใช้ std::swap หรือตัวแปรชั่วคราวเพื่อความชัดเจนและปลอดภัย