• C 语言中函数的跳转


    1.同一个函数内,可以使用goto语句:

    eg:

      void  text_1( void )

      {

        char i=0;

        a :

        i++;

        printf ( " text_1 = %d \r\n" , i);

        goto a ;

      }

    2.不同函数之间的跳转,可以使用 setjmp / longjmp 函数:

    eg:

      #include "string.h"
      #include <setjmp.h>

      jmp_buf   jb;

      char i=0;

      void   text_2 ( void )

      {

        setjmp(jb);  // 保存当前AR到jb变量中

        i++;

        printf ( " text_2 = %d \r\n" , i);

      }

      void text_3 ( void )

      {

        longjmp(jb, 1);  // 设置当前AR为jb,并跳转到调用setjmp()之后的第一个语句处

      }

      void main ( void )

      {

         text_2 ( );

        wheil ( 1 )

        {

           text_3 ( );

        }

         }

            这里 setjmp( ) 第一次调用时总是返回 0,并标记当前AR地址;而通过 longjmp ( jb , r ) 跳转后其返

    回值被修改为 r,并且 r 不能为 0。这样程序可以根据 setjmp( ) 的返回值来判断是否是 longjmp( ) 导致了

    跳转才执行到此。

      C语言中每当有一个函数调用时,就会在堆栈(Stack)上准备一个被称为AR的结构,这个方法主要是

    利用了 Active Record (活动记录)的地址实现的跳转。

    注意:函数跳转不要乱用,容易打乱程序,一般函数跳转可以拿来做一些异常处理机制!

  • 相关阅读:
    PAT L2-014【二分】
    CodeForces 137C【贪心+优先队列】
    CodeForces 131D【图特性+BFS】
    CodeForces 125D【鸽巢原理】
    PAT1060【大模拟啊】
    CodeForces 124C【连通块】
    PAT 1071【STL string应用】
    CodeForces 116C 【BFS】
    CodeForces 116B【二分匹配】
    CodeForces 118C 【模拟】
  • 原文地址:https://www.cnblogs.com/xingboy/p/9552409.html
Copyright © 2020-2023  润新知