C 函数范围

学习C - C函数范围

静态变量

静态变量可以保留从一个函数调用到的信息下一个。

您可以使用此声明声明一个静态变量 count :

static int count = 0;

单词static是一个关键字。

单词static是一个关键字。...

被声明为静态的变量的初始化只发生一次,就在开头程序。

虽然静态变量仅在包含其声明的函数内可见,它本质上是一个全局变量。

以下代码显示了静态变量和自动变量之间的差异。


    #include <stdio.h> 

    // Function prototypes 
    void test1(void); 
    void test2(void); 
      
    int main(void) { 
      for(int i = 0 ; i < 5 ; ++i) { 
        test1(); 
        test2(); 
      } 
      return 0; 
    } 
    // Function test1 with an automatic variable 
    void test1(void) 
    { 
      int count = 0; 
      printf("test1   count = %d\n", ++count ); 
    } 

    // Function test2 with a static variable 
    void test2(void) 
    { 
      static int count = 0; 
      printf("test2   count = %d\n", ++count ); 
    } 

上面的代码生成以下结果。



在函数之间共享变量

为了在函数之间共享变量,在程序文件的开头声明一个变量所以他们“超出了功能的范围。

这些被称为全局变量,因为它们“可以随时随地访问。


    #include <stdio.h> 
      //w w w. jav  a  2  s  .  c  o  m
    int count = 0;                         // Declare a global variable 
      
    // Function prototypes 
    void test1(void); 
    void test2(void); 
      
    int main(void) { 
      int count = 0;                       // This hides the global count 
      
      for( ; count < 5 ; ++count) { 
        test1(); 
        test2(); 
      } 
      return 0; 
    } 
      
    void test1(void) { 
      printf("test1   count = %d\n", ++count); 
    } 
    void test2(void) { 
      printf("test2   count = %d\n", ++count); 
    } 

上面的代码生成以下结果。



函数递归

一个函数可以调用自身。这称为递归。

调用自身的函数也必须包含停止过程的方式。

以下代码显示如何计算整数的阶乘。

任何整数的阶乘是所有从1到的整数的乘积整数本身。


    #include <stdio.h> 
      /*  w w w. j a  v  a2  s.  c om*/
    unsigned long long factorial(unsigned long long); 
      
    int main(void) { 
      unsigned long long number = 10LL; 
      printf("The factorial of %llu is %llu\n", number, factorial(number)); 
      return 0; 
    } 
    // A recursive factorial function 
    unsigned long long factorial(unsigned long long n) { 
      if(n < 2LL) 
        return n; 
         
      return n*factorial(n - 1LL); 
    } 

上面的代码生成以下结果。

abort()函数

调用abort()函数会导致程序异常终止。

它不需要参数。

当你想结束一个程序时,这样调用:

abort();                          // Abnormal program end

exit()和atexit()函数

exit()函数导致程序的正常终止。

该函数需要一个类型的参数int表示终止时的程序状态。

参数可以为0或EXIT_SUCCESS以指示a成功终止,并将其返回到主机环境。

例如:

exit(EXIT_SUCCESS);               // Normal program end

如果参数是EXIT_FAILURE,则将向主机环境返回故障终止的指示。

您可以通过调用atexit()注册您自己的函数,由exit()调用。

您调用atexit()函数来标识要执行的函数当应用程序终止时。

这里的你怎么可能这样做:

void CleanUp(void);// Prototype of function

if(atexit(CleanUp)) 
  printf("Registration of function failed!\n"); 
 

_Exit()函数

_Exit()函数与exit()基本上执行相同的工作。

_Exit()不会调用任何注册的函数。

你调用_Exit()像这样:

_Exit(1);                         // Exit with status code 1