学习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()