本文我们将说明C语言程序的结构
首先,我们来编写一个简单的C语言代码
#include<stdio.h> // 编译预处理指令
// 定义add函数,该函数接受两个整数x和y作为参数,并返回它们的和
int add(int x, int y)
{
int z = 0; // 声明并初始化一个整型变量z,用于存储x和y的和,初始值设为0
z = x + y; // 计算x和y的和,并将结果存储在变量z中
return z; // 返回变量z的值,即x和y的和
}
//定义主函数
int main()
{
int a = 0; // 声明并初始化整型变量a,用于存储用户输入的第一个整数,初始值设为0
int b = 0; // 声明并初始化整型变量b,用于存储用户输入的第二个整数,初始值设为0
// 使用scanf函数从标准输入读取两个整数,并将它们分别存储在变量a和b中
scanf("%d %d", &a, &b);
// 调用add函数,将a和b作为参数传递,并将返回的结果存储在变量c中
int c = add(a, b);
// 使用printf函数输出变量c的值,即a和b的和
printf("%d ", c);
return 0; // 程序正常结束
}
通过以上代码,我们来简单谈谈C语言程序结构分为哪几个部分:
一个程序由一个或多个源程序文件组成,而一个源程序文件可以包括5个部分:
一、 预处理指令
它的主要作用是在编译之前,将指定的文件内容插入到当前文件中。
#include<filename>:用于包含标准库头文件或系统头文件
#include<filename>:用于包含用户定义的头文件(可包含路径)
二、 全局声明
全局声明指的是在函数外部进行的声明,这些声明对于程序中的所有函数都是可见的
2.1全局变量
#include<stdio.h>
int a = 10;
void func1()
{
...
//在这里可以修改和访问a
}
void func()
{
...
//在这里可以修改和访问a
}
2.2 全局常量
#define PI 3.14159
2.3 函数原型
是在函数实现之前在全局作用域中声明的函数签名,它告诉编译器函数的返回类型(void等)、名称和参数列表(括号内的)
// 函数原型声明
void test();
// 函数实现
void test() {
printf("Hello, World!\n");
}
int main() {
test(); // 调用函数
return 0;
}
2.4 结构体、联合体、枚举等类型定义
//结构体定义
struct test(){
...
}
//枚举定义
enum test(){
...
}
三、 函数定义
要指定每个函数的功能
一个函数包括两个部分:函数首部 + 函数体
1)函数首部:包括函数类型,函数名,函数参数类型,函数参数名
//函数定义,接受两个整型参数x和y int add (int x,int y)
一个函数名后面必须跟一个圆括号写参数类型及参数名
如果函数不需要从命令行接收输入的程序,则不需要写参数类型及参数名,如:
int main () / int main (void)
有的同学可能会疑惑,在开始举例的代码中,int main() 后明明有参数啊,为什么是空括号呢?
回答:尽管它看起来没有参数,但它仍然可以执行程序所需的所有操作,包括声明和使用局部变量、调用其他函数等。函数体内(花括号{}内的)的局部变量不是main函数的参数,而是函数执行期间在栈上分配的临时储存空间。调用其他函数中的参数也不是main函数的参数,这些参数是传递给被调用函数的。
2)函数体:函数首部下面花括号内的部分。如果一个函数中包含多个花括号,则最外面的一对花括号是函数体的范围。包括声明部分、执行语句和返回语句三部分:
声明部分:在函数体的开始部分,可以声明在函数内部使用的变量。这些变量是局部变量,它们的生命周期仅限于函数执行期间。
执行语句:函数在被调用时应该执行的具体操作
返回语句:函数类型非void的函数体必须包含一个或多个返回语句,返回语句制定了函数的返回值,并且每个返回语句都会导致函数立即退出。void类型没有返回值,则使用return;退出
四、主函数
一个C语言程序是由一个或多个函数组成的,其中必须包含一个main函数。main函数是程序的入口,有且仅有一个。(即使一个项目有多个.c文件,但是main只能有一个)
注:main 前面的int表示main函数执行结束的时候返回一个整型类型的值,所以return 后可以接任何整型值,但是一般接0表示程序成功执行结束。如果后面跟其他值,则需在程序的文档中明确说明了每个非零返回值所代表的含义,否则其他程序或工具可能无法正确理解这些值。
main多种写法:
//函数定义中有介绍
int main ()
{
return 0;
}
//确实不需要接受命令行参数
int main (void)
{
return 0;
}
//需要接受命令行参数(argc 是一个整数,表示命令行参数的数量,而 argv 是一个指向字符指针数组的指针,每个字符指针都指向一个命令行参数)
int main(int argc, char *argv[])
{
return 0;
}
//不需要返回值
void main ()
{
printf("hello!")
}
五、注释
注释是对代码的说明,编译器会忽略注释,注释对实际代码没有影响
写必要的注释,帮助我们以及后期阅读代码的人更好地理解,也会给面试官留下好印象
包括/* */和//两种形式:
5.1 /* */
/* 开始 ,遇到*/结束。不支持嵌套。
// /* */注释的三种举例
/* 注释 */
/*
注释
*/
int add (int x/* 注释 */,int y)
5.2 / /
从/ /开始,到行尾都属于注释。所以它不能和/* */一样放在代码中间。
// 注释
int main() // 注释
下节我们将具体讲讲scanf语句和printf语句,以及库函数的具体内容