C 函数

学习C - C函数

变量作用域和生命周期

这个例子涉及一个循环的嵌套块:

你在循环块中声明和定义count2:

count2在每次循环迭代时重新创建,初始值为0。

在每个循环迭代期间,count2被创建,初始化,递增和销毁。

变量count1存在于main()块级别。

它在递增时继续存在。


    #include <stdio.h>
    int main(void) {
      int count1 = 1;                               // Declared in outer block

      do {
        int count2 = 0;                             // Declared in inner block
        ++count2;
        printf("count1 = %d     count2 = %d\n", count1, count2);
      } while( ++count1 <= 10);

      // count2 no longer exists

      printf("count1 = %d\n", count1);
      return 0;
    }

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

新作用域

以下代码有两个名为count的变量。

在循环块内,局部变量将“隐藏”存在于main()块级别的count版本。

count是指的是在当前块的声明。

在do-while循环中,只能达到局部版本的count。

循环块中的printf()显示局部count值,该值始终为1。

一旦退出循环,外部count变量变为可见,最后一个printf()从循环中显示其最终值。


    #include <stdio.h>
    int main(void) {
      int count = 0;                                // Declared in outer block
      do {
        int count = 0;                              // This is another variable called count
        ++count;                                    // this applies to inner count
        printf("count = %d\n", count);
      }
      while( ++count <= 10);                // This works with outer count

      printf("count = %d\n", count);       // Inner count is dead, this is outer count
      return 0;
    }

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

变量作用域和函数

每个函数的主体是一个块。

在函数中声明的变量是局部的函数。

定义函数

函数的一般形式如下所示:

Return_type  Function_name(type1 para1, type2 para2,...) {
   // Statements...
}

函数体中的语句可以不存在。

从一个函数的返回值与body中的语句被指定为void。

对于具有非void返回类型的函数,其返回语句必须返回指定返回类型的值。

该参数指定在调用函数时应传递给该函数的值的类型。

传递给与参数相对应的函数的值称为参数。

函数参数由参数名称后面的类型组成。

调用函数的一般形式是以下表达式:

Function_name(argument1, argument2, ...)

您使用函数的名称后跟一个括号中的逗号分隔的参数列表。

一个函数调用本身可以作为一个语句显示,如下所示:

printf("hi.");

这样调用的函数可以是一个返回值的函数。

在这种情况下,返回的值被丢弃。

已经使用void返回类型定义的函数只能这样调用。

返回值的函数可以在表达式中。

例如:

result = 2.0*sqrt(2.0);

函数命名和参数

函数的名称可以是C中的任何合法名称。

函数参数是需要指定的参数的占位符。

函数的参数是具有其类型的参数名称列表,连续的参数用逗号分隔。

将参数传递给函数时,将参数值复制到函数中。

返回值类型

我们再来看一下函数的一般形式:

Return_type  Function_name(...
{
   // Statements...
}

Return_type指定函数返回的值的类型。

函数原型

您可以先定义main()函数,然后定义函数Average()。

// #include ...

int main(void) {
   ...

   Average...
}

double Average(double x[], size_t n) {
   ...
}

这不会编译。

当编译器看到main()中的Average()函数时,它不会知道Average()函数。

我们可以使用函数原型来解决这个问题。

函数声明或函数原型是定义函数原型的语句。

函数原型定义函数的名称,返回值类型以及每个参数的类型。

一个函数的原型与函数头完全相同,后缀中带有一个分号。

以下代码显示了如何创建函数原型。

// Function prototypes
double Average(double data_values[], size_t count);

int main(void) {
  ...
}

// Definitions for Average()