setjmp और longjmp (<setjmp.h>) का उपयोग करके लूप/रिकर्सन के बिना पुनरावृत्ति प्राप्त की जा सकती है। यह नॉन-लोकल गोटो तंत्र है।
सिंटैक्स
int setjmp(jmp_buf env); // वर्तमान स्टेट सेव करता है, 0 रिटर्न करता है void longjmp(jmp_buf env, int val); // सेव्ड स्टेट पर कूदता है, val रिटर्न करता है
उदाहरण: 100 बार '5' प्रिंट करें
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;
int main() {
int count = 1;
setjmp(buf); // जंप पॉइंट सेट करें (पहली बार 0 रिटर्न करता है)
printf("5");
count++;
if (count <= 100)
longjmp(buf, 1); // buf पर वापस कूदें, 1 रिटर्न करें
return 0;
}
आउटपुट
5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
कैसे काम करता है
setjmp(buf)वर्तमान रजिस्टर्स/स्टैक पॉइंटर कोbufमें सेव करता है, 0 रिटर्न करता है।printf("5")निष्पादित होता है।countबढ़ाया जाता है।longjmp(buf, 1)कंट्रोल कोsetjmpकॉल पर वापस भेजता है, लेकिन इस बारsetjmp1 रिटर्न करता है।- चरण 2-4 दोहराते हैं जब तक
count > 100नहीं हो जाता।
चेतावनियां
- खराब अभ्यास: यह स्पेगेटी कोड बनाता है, डीबगिंग कठिन होती है।
- रिसोर्स लीक:
longjmpस्टैक अनवाइंडिंग नहीं करता - लोकल ऑब्जेक्ट्स के डिस्ट्रक्टर्स (C++) या क्लीनअप कोड नहीं चलते। - सिग्नल हैंडलर्स: केवल
sigsetjmp/siglongjmpसिग्नल हैंडलर्स में सुरक्षित हैं। - केवल शैक्षणिक: वास्तविक कोड में लूप्स उपयोग करें।