zoukankan      html  css  js  c++  java
  • 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 (活动记录)的地址实现的跳转。

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

  • 相关阅读:
    HDU 2844 Coins(多重背包)
    HDU 4540 威威猫系列故事——打地鼠(DP)
    Codeforces Round #236 (Div. 2)
    FZU 2140 Forever 0.5
    HDU 1171 Big Event in HDU(DP)
    HDU 1160 FatMouse's Speed(DP)
    ZOJ 3490 String Successor
    ZOJ 3609 Modular Inverse
    ZOJ 3603 Draw Something Cheat
    ZOJ 3705 Applications
  • 原文地址:https://www.cnblogs.com/xingboy/p/9552409.html
Copyright © 2011-2022 走看看