ฉันสังเกตว่าคำถามคือ "มีวิธีอื่นในการทำลายลูปทั้งหมดหรือไม่" ฉันไม่เห็นคุณสมบัติใด ๆ แต่มันไม่ใช่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นำคุณออกจากลูปที่ซ้อนกันเท่านั้น แต่ยังทำงานร่วมกับฟังก์ชันที่ซ้อนกันได้อีกด้วย!