C语言中的跳转语法

goto跳转


例:

1
2
3
4
5
int a=2, b=3;
if(a < b)
goto pb;
printf("a=%d \n", a);
pb:printf("b=%d \n", b);

如上,满足条件跳转到pb标签位置,使用标签:代码语句的形式,表明标签处要处理的代码

建议不使用goto,维护麻烦

非局部跳转


需要引入标准库,#include <setjmp.h>

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <setjmp.h>
jmp_buf jump_buffer, buffer;
void func1(void) {
printf("Before calling longjmp\n");
longjmp(jump_buffer, 3);
printf("After calling longjmp\n");
}
void func2(void) {
printf("Before calling func2\n");
if (setjmp(buffer) == 1) {
printf("calling func2\n");
longjmp(buffer, 2);
} else {
func1();
}
printf("After calling func2\n");
}
int main(int argc, const char * argv[]) {
int r = setjmp(jump_buffer);
if (r == 0){
printf("first calling set_jmp\n");
func2();
}else {
printf("second calling set_jmp r=%d\n", r);
}
printf("\n");
return 0;
}

最后输出

1
2
3
4
first calling set_jmp
Before calling func2
Before calling longjmp
second calling set_jmp r=3

setjmp(env),会从env中,获取到状态信息,首次调用返回0;longjmp(env, state),会恢复state,并存入到env中,然后跳转到最近一次执行的setjmp(evn)中去,去重新执行。

setjmp(env)的返回值,只有首次调用才返回0;

其它时候应该由longjmp()传入一个非0的值,以用于后期处理。

同样的,这个跳转方式,也不推荐,看着太晕了

------ 本文结束 ------

版权声明
协议:No Fuck License

stone 创作并维护
本文首发于 stone世界 博客( http://stone86.top
版权所有,侵权必究。如要转载,请声明出处

Fork me on GitHub