ฉันสังเกตว่าคำถามคือ "มีวิธีอื่นในการทำลายลูปทั้งหมดหรือไม่" ฉันไม่เห็นคุณสมบัติใด ๆ แต่มันไม่ใช่goto
โดยเฉพาะ OP ไม่ได้ขอวิธีที่ดี แล้วเราจะlongjmp
ออกจากวงในได้อย่างไร? :-)
#include <stdio.h>
#include <setjmp.h>
int main(int argc, char* argv[]) {
int counter = 0;
jmp_buf look_ma_no_goto;
if (!setjmp(look_ma_no_goto)) {
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
if (i == 500 && j == 500) {
longjmp(look_ma_no_goto, 1);
}
counter++;
}
}
}
printf("counter=%d\n", counter);
}
setjmp
ฟังก์ชั่นผลตอบแทนครั้งที่สอง ในครั้งแรกจะคืนค่า 0 และโปรแกรมเรียกใช้งานที่ซ้อนกันสำหรับลูป จากนั้นเมื่อทั้งสองi
และj
เป็น 500 มันจะดำเนินการlongjmp
ซึ่งทำให้setjmp
กลับมาอีกครั้งด้วยค่า 1 โดยข้ามไปที่ลูป
ไม่เพียง แต่จะlongjmp
นำคุณออกจากลูปที่ซ้อนกันเท่านั้น แต่ยังทำงานร่วมกับฟังก์ชันที่ซ้อนกันได้อีกด้วย!