C语言组成

C语言程序结构

1、预处理器指令
2、函数
3、变量
4、语句 & 表达式
5、注释

一、预处理器指令

预处理程序应该处理以下指令:

#include #if #ifdef #ifndef #else #elif #endif #define #undef #line #error #pragma
一、头文件:接在#include后面一般包含下面几方面,#include <stdio.h> 。
(1)类型定义
枚举和结构体一般都是在头文件之中。
(2)函数声明
一个头文件对应一个C文件,该C文件中定义的函数,都要在这个头文件中做外部声明,因为这个函数可能被其他的c文件里面的函数引用。
(3)数据的声明
数据声明,我理解为变量的声明,注意是声明,不是定义。例如有个变量,不是在这个头文件对应的C文件里面定义的,但是却要用它,这个变量就应该在这个头文件里面做一下外部声明。
(4)常量的定义
这个不能理解
(5)包好命令
即包含其他的头文件
(6)宏定义
(7)注释
头文件不能包含以下内容
一般函数定义,数据定义,常量聚集定义

二、宏定义:接在#define后面一般包含下面几方面。
(1)宏代换
#define ONE 1
(2)调试宏
FILE: 所在文件名
FUNCTION:所在函数名
LINE:所在行数
DATE:执行日期
TIME:执行时间
#define printNum(x) printf("%s = %d\n", #x, x)
#define printFun(x) printf("%s\n", #x)
/* ## 连接符,用于把两个语言符号组合成单个语言符号 */
#define val(x) val##x#define num(x) n##x
#define test(x) test##x
printf("%s\n", FILE);
printf("%s\n", FUNCTION);
printf("%d\n", LINE);
printf("%s\n", DATE);
printf("%s\n", TIME);

三、条件编译:
1、#if、#else、#elif #endif
#else既是标记#if块的结束,也标记#else块的开始。因为每个#if只能写一个#endif匹配。
2、#ifdef和#ifndef
编译指令#ifdef和#ifndef,分别表示“如果已定义”和“如果未定义”。
3、 #undef
删除前面定义的宏定义。
4、#line
#line指令改变__LINE__和__FILE__的内容。__LINE__和__FILE__都是编译程序中预定义的标识符。标识符__LINE__的内容是当前被编译代码行的行号,__FILE__的内容是当前被编译源文件的文件名。#line的一般形式是:
#line number “filename”
5、#pragma
#pragma是编译程序实现时定义的指令,它允许由此向编译程序传入各种指令。
#pragma提高C源程序对编译程序的可移植性。

实例
#include <stdio.h> 
int main()
{
   /* 我的第一个 C 程序 */
   printf("Hello, World! \n");   
   return 0;
}

二、函数

在程序中int main() 是主函数,程序从这里开始执行。

函数声明和函数定义

函数声明告诉编译器函数的名称、返回类型和参数。
函数定义提供了函数的实际主体。
函数定义:

return_type function_name( parameter list )
{
   body of the function
}

函数声明:

int max(int, int);

注意:
1、在函数定义一般都是在.c文件之中,而函数的定义都是在头文件之中。
2、在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明。
3、定义和声明势函数必须具有的。
4、如果定义和调用在一个函数里面,需要定义在调用之前。先声明后调用。
5、内部函数在定义的时候就是加static

static 类型名 函数名 (形参表)

外部函数在定义时加extern

extern int max (int a,int b)

6、函数声明和函数定义里面参数可以不同,在此时注意参数类型。

三、变量

一、变量的类型
short、int、long、char、float、double
int:内存大小是4 个byte;
long:内存大小是4 个byte;
float:内存大小是4 个byte;
double:内存大小是8 个byte;
char:内存大小是1 个byte。

二、变量的声明与定义

extern int a;     // 声明一个全局变量 a
int a;            // 定义一个全局变量 a
extern int a =0;  // 定义一个全局变量 a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间
int a =0;         //定义一个全局变量 a,并给初值

声明之后你不能直接使用这个变量,需要定义之后才能使用。
当引用一个全局变量的时候,你就要声明 extern int a 这时候 extern 不能省略,因为省略了,就变成 int a 这是一个定义,不是声明。

变量可以在声明的时候初始化

extern int d = 3, f = 5;    // d 和 f 的声明与初始化
int d = 3, f = 5;           // 定义并初始化 d 和 f
byte z = 22;                // 定义并初始化 z
char x = 'x';               // 变量 x 的值为 'x'

变量定义:
不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的。
变量声明:
变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。
变量的声明有两种情况:
1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。

2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。

除非有extern关键字,否则都是变量的定义。

extern int i; //声明,不是定义
int i; //声明,也是定义

如果需要在一个源文件中引用另外一个源文件中定义的变量,我们只需在引用的文件中将变量加上 extern 关键字的声明即可。
在此时就是注意static和extern的不同。

全局变量和局部变量所在的位置有什么不同。

全局变量保存在内存的全局存储区中,占用静态的存储单元;局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。
C语言经过编译之后将内存分为以下几个区域:

(1)栈(stack):

由编译器进行管理,自动分配和释放,存放函数调用过程中的各种参数、局部变量、返回值以及函数返回地址。操作方式类似数据结构中的栈。

(2)堆(heap):

用于程序动态申请分配和释放空间。C语言中的malloc和free,C++中的new和delete均是在堆中进行的。正常情况下,程序员申请的空间在使用结束后应该释放,若程序员没有释放空间,则程序结束时系统自动回收。注意:这里的“堆”并不是数据结构中的“堆”。

(3)全局(静态)存储区:

分为DATA段和BSS段。DATA段(全局初始化区)存放初始化的全局变量和静态变量;BSS段(全局未初始化区)存放未初始化的全局变量和静态变量。程序运行结束时自动释放。其中BBS段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。

(4)文字常量区:

存放常量字符串。程序结束后由系统释放。

(5)程序代码区:

存放程序的二进制代码。

显然,C语言中的全局变量和局部变量在内存中是有区别的。C语言中的全局变量包括外部变量和静态变量,均是保存在全局存储区中,占用永久性的存储单元;局部变量,即自动变量,保存在栈中,只有在所在函数被调用时才由系统动态在栈中分配临时性的存储单元。

四、语句与表达式

1、语句

语句主要有一下几类
1.复合语句
用大括号括起来的一些语句。这些语句被看成一个整体。如{t=x;x=y;y=t}中,共有3条语句,每个语句都以分号结尾。
2.控制语句
控制语句用于控制程序的流程,以实现程序的各种结构方式。它们由特定的语句定义符组成。C语言有9种控制语句,
可分成以下3类。
(1)条件判断语句:if 语句,switch 语句。
(2)循环执行语句:do while 语句,while 语句,for 语句。
(3)转向语句:break 语句,goto 语句,continue 语句,return 语句。
3.函数调用语句
一个函数调用加一个分号构成函数调用语句。例如: printf(“Where do you want to go?”); 上述语句是由一个printf格式输出函数加一个分号构成一条函数调用语句。
4.表达式语句
用表达式构成语句,表示一个运算或操作。C语言中最简单的语句是表达式语句,它的一般形式:<表达式>; 其实表达式语句就是在表达式最后加上一个“;”。一个表达式语句必须在最后出现分号,分号是表达式语句中不可或缺的。例如:4+5; ab&&cd;
5.空语句
只有分号“;”组成的语句称为空语句。空语句不执行任何操作,在程序中可用来做空循环体。例如: while(getchar()!=’\n’); 该语句的功能是,只要从键盘输入的字符不是回车则重新输入。这里的循环体是空语句。

2、表达式

用C语言运算符将运算对象连接起来的式子,就叫表达式。

五、注解

对函数内容进行解释。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值