1 前言
本人编写该文章主要是为了顽固已学过的C语言知识。如有错误还请读者指出。
2 声明与定义
(1)C语言属于解释式语言,在使用某种代表特殊含义的标示符运算时,必须使用C语言的关键字声明或定义。使编译器可知该标识符所代表的含义,以便做一些检查转换。
(2)在C语言中(C99标准)声明标识符时,声明可声明多次而编译器不会为其分配存储空间。目的是为了是编译器知道该标识符所代表的含义及原型所在(文件与文件之间)使用关键字extern 修饰变量或函数称为声明(引用)可使同工程目录下的变量或函数实现交互。而定义与前面所说的相反。在定义时编译器会为该标识符分配相应的存储空间。具体分配多少视C语言类型关键字及系统位数而定。函数原型和指针所占空间视系统位数而定。
2.1 变量
(1)C语言在参与运算时,必须用C类型关键字创建一个或多个标识符。在使用该标识符时,编译器会为该标识符分配相应的存储空间。该标识符也称为变量(可变的量)。例程如下所示
void main(void)
{
int a; /* 定义a变量 */
a=123;
printf("a的值为:%d", a);
}
(2)变量的作用域。在使用变量时该变量的使用范围称为变量的作用域。作用域分为局部变量(作用域只限函数内)与全局变量(作用域只限变量名其后的函数 不加extern 的情况下)。如果局部与全局变量名相同则采用就近原则,优先使用局部变量。例程如下所示
#include <stdio.h>
/*
***********************
* 函数外的变量称为全局变量
* 函数内的变量称为局部变量
* 当局部与全局变量名相同时
* 编译器将用局部变量参与运算
*/
void max(void)
{
...
}
int a=5,b=5; //作用域只限其后函数
int main(void)
{ /* 作用域只限大括号内 */
int a,b; //使用该变量
a=10; b=20;
{ /* 作用域只限该括号内 */
int a,b;
a=15; b=25;
printf("a=%d,b=%d\n",a,b); /* 输出 15,25 */
}
printf("a=%d,b=%d\n",a,b); /* 输出 10,20 */
return 1;
}
(3)变量的声明与定义。
在C语言(C99标准)中全局变量允许同变量名声明多次,可包含extern。局部变量不允许声明,因为作用域只限内部。定义时不论全局或局部变量名只允许定义一次。在定义变量时最好给变量赋予初值,以降低容错率(容易出错的机率)。例程如下所示
定义:多个全局变量名相同时,赋了初值的称为定义。但是未赋值的编译器会自动赋值。也可认为声明=定义
声明:不会分配存储空间全局变量可声明多次
exturn:引用修饰符,引用同工程目录下的文件中的全局变量或同文件下的全局变量。该修饰符也称为声明引用关键字
a.c
#include <stdio.h>
int OvtSit /* 全局变量 */
int max(void)
{
...
return 1;
}
b.c
#include <stdio.h>
extern int OvtSit; /* 定义在 a.c */
extern int OviSit; /* 声明多次 */
int main(void)
{
int a; /* 定义a 这里的变量是一个未知的值 */
int b=0; /* 降低容错率 */
return 1;
}
2.2 函数
在C语言中函数也有声明与定义。函数声明主要是使编译器知道该函数的一些参数类型(返回值和形参类型)以便编译器做一些类型检查和转换。函数的声明也称为函数原型。编译器会为其分配存储空间。函数定义即程序实现部分。在C语言中程序都是由函数包含起来的,每个函数负责不同的功能实现。因此C语言也称为结构化编程语言。
(1)函数的作用域,函数定义时作用域只限其后函数。声明完其他函数都可已用。加了static只限本文件内使用。外部文件不可访问。
static:静态存储区修饰符。用该修饰符修饰了变量或函数他们不可被外部文件访问。作用域只限文件内
a.c
#include <stdio.h>
/* 作用域只限该文件内 */
static void man(void)
{
...
}
b.c
#include <stdio.h>
/* 出错 */
static void man(void);
int main(void)
{
return 1;
}
(2)函数的声明,在使用某函数时,定义部分不在主调函数的前面和不同文件内需声明函数,可在函数外或内声明,以及在头文件中声明了某函数在使用该函数时需把头文件添加进来。函数声明也被称为函数原型。如下所示
注意:无论有多少个函数且只能有一个主函数
a.h
/* 条件编译 预处理器命令的一种 */
#ifndef __PROTOTYPE_H /* 未定义该宏则执行其后程序 */
#define __PROTOTYPE_H /* 直到遇到 #else, #endif */
void max(void);
#endif /* __PROTOTYPE_H */
预处理器命令分为三种:1 包含文件(通常为头文件),2 条件编译如上所示,宏定义(字符串替换及展开)
a.c
#include “a.h”
#include <stdio.h>
void max(void) /* 不同文件的函数 */
{ /* 原型在 a.h 文件中 */
...
}
b.c
#include <stdio.h>
extern void max(void); /* 不在本文件中需声明引用 */
void man(void); /* 函数不在主调函数前需声明 */
int main(void) /* 主调函数 */
{
man(); /* 调用部分 */
/* 函数定义部分 */
}
void man(void) /* 被调函数 */
{
...
}
(3)函数的定义,即函数的实现部分(执行某些功能的程序集合)。在主调函数前定义时无需声明该函数原型可直接调用。
注意:函数定义时不予许嵌套定义,即函数内部不允许再定义函数。但是函数之间可以进行嵌套调用相互调用,也可以自己调用自己(递归调用)。不允许其他函数调用主函数
#include <stdio.h>
void max(void); /* 用到的函数原型 */
void ABC(void);
int main(void)
{
...
max();
void ABC(void) /* 不允许在函数内定义 */
{
...
}
return 1;
}
void max(void)
{
...
ABC(); /* 嵌套调用 */
}
void ABC(void)
{
...
max(); /* 相互调用 */
main(); /* 不允许调用主函数 */
}
3 小结
(1)先带读者了解本人编写该文章的目的。
(2)带读者了解变量和函数的声明与定义的区别及作用域。