📘 Lesson  ·  Lesson 61

Swap Without Third Variable

बिना third variable swap क्यों?

दो numbers को swap करना यानी उनकी values आपस में बदलना: अगर a 5 है और b 9, तो swap के बाद a 9 और b 5 हो जाता है। सीधा तरीका एक temporary variable इस्तेमाल करता है। लेकिन C का एक बहुत आम interview सवाल है — यही काम बिना किसी third (temporary) variable के करना।

ऐसा इसलिए नहीं कि यह तेज़ है — आमतौर पर नहीं होता। यह इसलिए पूछा जाता है ताकि पता चले कि आप arithmetic और bitwise operators को कितना समझते हैं। इस page पर आप चार अलग तरीके सीखेंगे, हर एक का सही output देखेंगे, और यह भी जानेंगे कि हर तरीका कहाँ चुपचाप टूट जाता है।

💡 सामान्य तरीका (तुलना के लिए)

साफ़ swap temp variable से होता है: int t = a; a = b; b = t;। असली projects में यही सही विकल्प है। नीचे दिए tricks interview और समझने के लिए हैं।

तरीका 1: जोड़ और घटाव

विचार यह है कि दोनों का कुल जोड़ a में रखें, फिर घटाकर हर original value वापस निकालें।

C Language
#include <stdio.h>
int main() {
    int a = 5, b = 9;
    a = a + b;   // a = 14 (कुल जोड़)
    b = a - b;   // b = 14 - 9 = 5 (original a)
    a = a - b;   // a = 14 - 5 = 9 (original b)
    printf("Swap ke baad: a = %d, b = %d\n", a, b);
    return 0;
}
Output:
Swap ke baad: a = 9, b = 5
⚠️ छिपा हुआ खतरा

अगर a और b दोनों बड़े हों, तो a + b किसी int की range (लगभग 2.1 अरब) से बाहर जाकर overflow कर सकता है और गलत result देता है। यह तरीका सिर्फ़ छोटी values के लिए सुरक्षित है।

तरीका 2: गुणा और भाग

वही विचार, पर जोड़-घटाव की जगह गुणा-भाग से।

C Language
#include <stdio.h>
int main() {
    int a = 5, b = 9;
    a = a * b;   // a = 45
    b = a / b;   // b = 45 / 9 = 5
    a = a / b;   // a = 45 / 5 = 9
    printf("Swap ke baad: a = %d, b = %d\n", a, b);
    return 0;
}
Output:
Swap ke baad: a = 9, b = 5
⚠️ दो समस्याएँ

अगर कोई value 0 हो तो यह तरीका पूरी तरह fail हो जाता है (zero से भाग)। जो numbers पूरे-पूरे भाग नहीं होते उनमें accuracy भी खोती है। इसे सिर्फ़ जानकारी के लिए समझें।

तरीका 3: XOR (bitwise) swap

XOR operator (^) की खासियत: कोई value खुद से XOR होकर 0 बन जाती है, और XOR उलटा किया जा सकता है। इससे बिना overflow के swap हो जाता है।

C Language
#include <stdio.h>
int main() {
    int a = 5, b = 9;
    a = a ^ b;   // a और b के bits जोड़ें
    b = a ^ b;   // original a को b में लाएँ
    a = a ^ b;   // original b को a में लाएँ
    printf("Swap ke baad: a = %d, b = %d\n", a, b);
    return 0;
}
Output:
Swap ke baad: a = 9, b = 5

XOR bit-by-bit काम करता है और carry नहीं करता, इसलिए overflow नहीं होता — यही arithmetic तरीके पर इसकी असली बढ़त है।

⚠️ Self-swap जाल

अगर दोनों variable एक ही memory location हों (जैसे swap(&x, &x)), तो XOR swap उस variable को 0 कर देता है, क्योंकि x ^ x 0 होता है। XOR-swap से पहले हमेशा जाँचें कि दोनों addresses अलग हैं।

तरीका 4: One-line trick

जोड़ वाले तरीके को एक ही line में दबाया जा सकता है। दिखने में चालाक, पर पढ़ने में मुश्किल:

C Language
#include <stdio.h>
int main() {
    int a = 5, b = 9;
    a = a + b - (b = a);   // one-line swap
    printf("Swap ke baad: a = %d, b = %d\n", a, b);
    return 0;
}
Output:
Swap ke baad: a = 9, b = 5
💡 ध्यान दें

ऐसे one-liner evaluation order पर निर्भर करते हैं और आसानी से गलत हो जाते हैं। Interview में दिख सकते हैं, पर असली code में न लिखें — साफ़ाई चालाकी से बेहतर है।

कौन सा तरीका चुनें?

तरीकाOverflow safe?0 के साथ चलता है?पढ़ने में?
Temp variable (सामान्य)हाँहाँसबसे अच्छा
जोड़ / घटावनहींहाँठीक
गुणा / भागनहींनहींठीक
XORहाँहाँ*पेचीदा

*XOR 0 values के साथ सुरक्षित है, पर तब नहीं जब दोनों variable एक ही location हों।

आम गलतियाँ

  • यह भूलना कि बड़ी संख्याओं में जोड़ overflow कर सकता है और चुपचाप गलत result देता है।
  • जब value 0 हो सकती हो तब गुणा-भाग तरीका इस्तेमाल करना।
  • एक ही variable पर XOR swap लगाकर उसे गलती से 0 कर देना।
  • सिर्फ़ चालाक दिखने के लिए production code में unreadable one-liner लिखना।
🏋️ अभ्यास

XOR से एक swap function void swap(int *x, int *y) लिखें और उसमें जाँच जोड़ें जो x == y होने पर swap छोड़ दे। फिर swap(&n, &n) से test करें कि अब value 0 नहीं होती।

सारांश

  • बिना third variable swap एक interview/सीखने का अभ्यास है, performance trick नहीं।
  • जोड़-घटाव सरल है पर overflow कर सकता है।
  • गुणा-भाग 0 और अपूर्ण भाग पर टूट जाता है।
  • XOR swap overflow से बचता है पर दोनों operand एक ही address होने पर fail होता है।
  • असली code में सामान्य temp-variable swap सबसे साफ़ और उतना ही तेज़ है।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

क्या C में बिना third variable swap करना सच में बेहतर है?
आमतौर पर नहीं। आधुनिक compiler सामान्य temp-variable swap को बहुत अच्छे से optimise कर देते हैं और temp वाला तरीका पढ़ने में साफ़ होता है। बिना third variable swap ज़्यादातर interview और सीखने का अभ्यास है, असली performance फ़ायदा नहीं।
जोड़-घटाव वाला तरीका कब fail हो सकता है?
क्योंकि a + b किसी int की range से बड़ा हो सकता है और integer overflow हो जाता है। दोनों numbers बड़े हों तो sum wrap हो जाता है और गलत result मिलता है। बड़ी values के लिए temp variable या XOR तरीका बेहतर है।
अगर किसी variable को खुद से XOR-swap करें तो क्या होगा?
अगर दोनों operand एक ही memory location हों (जैसे swap(&x, &x)), तो XOR swap उस variable को 0 कर देता है, क्योंकि x ^ x हमेशा 0 होता है। यही XOR swap का छिपा हुआ bug है, इसलिए equal addresses की जाँच ज़रूरी है।
गुणा-भाग वाला तरीका किसी number के 0 होने पर चलेगा?
नहीं। अगर कोई भी value 0 हो, तो division step में zero से भाग हो जाता है और program टूट जाता है। इसीलिए multiply-divide trick असुरक्षित माना जाता है और असली code में कम इस्तेमाल होता है।
Interview में कौन सा swap तरीका सुनना पसंद किया जाता है?
ज़्यादातर interviewer चाहते हैं कि आप पहले कहें कि साफ़ temp-variable swap ही असली सही विकल्प है, फिर XOR तरीका और उसका self-swap edge case समझाएँ। Trade-offs पता होना trick रटने से ज़्यादा मायने रखता है।
← Back to C Tutorial
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.