- 前言
- 一、C语言是什么?
- 二、C语言的基本结构
- 三、C语言概述
- 1.数据类型
- (1)字符集
- (2)保留字
- (3)标识符
- (4)常量和变量
- (5)基本数据类型
- 2.运算符
- 1.C语言的运算符按功能可分为以下几类
- 2.运算符可按其运算对象的多少分为以下3类
- 3、算术运算符及算术表达式
- 3、循环
- 1、while循环语句
- 2、do -while循环语句
- 3、for循环语句
- 4、break语句和continue语句
- 4、数组
- 1、一维数组
- 2、多维数组
- 3、字符数组与字符串
- 5、函数
- 1、函数的定义
- 2、函数的调用
- 3、函数声明
- 4、函数调用中的数据传递方式
- 5、函数的嵌套调用和递归调用
- 6、局部变量和全局变量
- 7、动态存储变量与静态存储变量
- 6、结构体、联合体
- 1、结构体类型的定义和说明
- 2、联合体
- 7、指针
- 8、宏定义
- 1、无参宏定义
- 2、有参宏定义
- 3、宏定义的解除
- 总结
–
前言我们平时使用的计算机的本质,就是程序的机器。
程序和代码指令是让计算机成功运行的最基本前提。
但是计算机所能理解的只有“0”、“1”这两位二进制数,因此为了开发者的方便,程序语言设计产生,也就是C语言。
本文就C语言的基本内容进行以下概述:
提示:以下是本篇文章正文内容,下面案例可供参考
C语言起源于 BCPL语言。
Ken Lane Thompson、Dennis M.Ritchie在B语言的基础上设计出了C语言,并于Ken Thompson合作开发了C语言版的UNIX *** 作系统。
C语言的主要特点:
程序设计模块化 、函数方式 *** 作 、数据类型多样化 、运算功能强 、存储类型丰富 、具有预处理能力 、程序简洁 。
- 函数是C语言程序的基本单位
- 函数由函数首部和函数体两部分组成
- C语言程序的书写格式与规则。
(例如:C语言程序中的每条语句和数据声明的最后都必须以分号作为结束标志,分号是C语句的必要组成部分。
)
在C语言程序中允许出现的所有基本字符的组合称为C语言的字符集。
主要分为下列几类:
(1) 大小写英文字母各26个(共52个)
(2) 数字(10个)
(3) 键盘符号(33个)
转义字符:是由“反斜杠字符(\)”开始后跟单个字符或若干个字符组成,通常用来表示键盘上的控制代码或特殊符号。
(2)保留字
在C语言的程序中有特殊含义的英语单词称为“保留字”,也称“关键字”,主要用于构成语句,进行存储类型和数据类型定义。
注:所有的保留字均由小写字母组成 。
标识符是用户自定义的一种字符序列,通常用来表示程序中需要辨认的对象名称,如符号常量、变量、数组、函数等对象的名字。
C语言规定,标识符是由字母或下画线开头的字母、数字、下画线组成的一串符号。
以下列出的标识符为合法:
sum,near,day,Wang,_total,MONTH,for_erver1_2
以下列出的标识符为不合法:
3_day,list.er,*123,#3Dfg,last-3-4
在使用标识符时还必须注意以下几点:
(1) 在标识符中,大小写字母是有区别的。
(2) ANSI C标准没有规定标识符的长度,但是各种版本的C语言编译系统都有自己的规定。
(3) 标识符虽然可以由程序员随意定义,但标识符是用于标识某个量的符号。
见名知意。
(4) C语言规定,用户选取的标识符不能是C语言规定的保留字。
在程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量。
它们可与数据类型结合起来进行分类。
在C语言中,可以用一个标识符来表示一个常量,称为符号常量。
符号常量在使用之前必须先定义,其一般形式为:
#define 标识符 常量
注:习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。
使用符号常量具有下述几个好处。
(1) 书写简单不易出错。
(2) 修改程序方便。
(3) 含义清楚。
在程序运行过程中,其值可以变化的量称为变量。
每一个变量都有一个名字,称为变量名,以便被引用。
一个变量在内存中占据一定的存储空间,在该存储空间中存放一个属于某种数据类型的数据,称为变量的值。
特别注意:在C语言中,要求对所有用到的变量作强制定义,也就是必须“先定义,后使用”。
1、整形数据
整型常量就是整常数。
在C语言中,使用的整常数有八进制、十六进制和十进制3种。
在16位字长的机器上,基本整型的长度也为16位,因此表示的数的范围也是有限定的。
如果要表示的数超过了上述取值范围,就必须用长整型数来表示。
长整型数是用后缀“L”或“l”来表示的。
2、整型变量
数据的表示方法有多种多样,但是所有数据在内存当中都是以二进制形式存放的。
下面定义一个整型变量a:
int a; /*定义a为整型变量*/
a=19; /*给整型变量a赋值为19*/
实际上,数值在内存中是以补码的形式存放的。
数值分为正数和负数,其补码的表示形式是不一样的。
整型变量的类型:
整型变量可以分为基本型、短整型、长整型和无符号型4种。
(1) 基本型:类型说明符为int。
(2) 短整型:类型说明符为short int或short。
(3) 长整型:类型说明符为long int或long。
(4) 无符号型:类型说明符为unsigned。
无符号型又与上述3种类型匹配而构成:
无符号基本型:类型说明符为unsigned int或unsigned。
无符号短整型:类型说明符为unsigned short。
无符号长整型:类型说明符为unsigned long。
3、实型数据
实型也称为浮点型。
实型常量也称为实数或浮点数。
在C语言中,实数只采用十进制。
实型变量是由有限的存储单元组成的,能提供的有效数字是有限的。
这样就会存在舍入误差。
4、字符型数据
字符常量就是用单引号括起来的一个字符。
例如,‘a’、‘b’、’=’、’+’、’?'等都为字符常量
在C语言中,使用字符常量要注意以下几点:
(1) 字符常量只能用单引号括起来,不能用双引号或其他括号。
(2) 字符常量只能是单个字符,不能是字符串。
(3) 字符可以是字符集中任意字符。
字符变量是存放字符常量的变量,其取值是字符常量,即单个字符。
字符变量的类型说明符是char。
字符变量的定义形式:
char 标识符1,标识符2,… ,标识符n;
例如:char c1, c2, c3, ch ;
2.运算符
C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。
在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。
(1) 算术运算符:用于各类数值运算。
(2) 关系运算符:用于比较运算。
(3) 逻辑运算符:用于逻辑运算。
(4) 位 *** 作运算符:参与运算的数据,按二进制位进行运算。
(5) 赋值运算符:用于赋值运算
(6) 条件运算符:用于条件求值
(7) 逗号运算符:用于把若干表达式组合成一个表达式
(8) 指针运算符:用于取内容(*)和取地址(&)两种运算。
(9) 求字节数运算符:用于计算数据类型所占的字节数。
(10) 特殊运算符
(1) 单目运算符(仅对一个运算对象进行 *** 作):
! ~ ++ - - sizeof等。
(2) 双目运算符(对两个运算对象进行 *** 作):
+ - * / % < <= > 等。
(3) 三目运算符(对3个运算对象进行 *** 作)
:?:
3、算术运算符及算术表达式
1.基本算术运算符
算术运算符有以下几种:
(1) 加法运算符“+”:加法运算符为双目运算符,具有左结合性。
(2) 减法运算符“-”:减法运算符为双目运算符,具有右结合性。
(3) 乘法运算符“*”:双目运算,具有左结合性。
(4) 除法运算符“/”:双目运算,具有左结合性。
参与运算量均为整型时,结果也为整型,舍去小数。
如果运算量中有一个是实型,则结果为双精度实型。
(5) 求余运算符(模运算符)“%”:双目运算,具有左结合性。
要求参与运算的 *** 作数必须为整型。
求余运算的结果等于两数相除后的余数。
2、算术表达式
用算术运算符和括号将运算对象(也称 *** 作数)连接起来的、符合C语言语法规则的式子,称为算术表达式。
运算对象可以是常量、变量、函数等。
例如:3+6*9、(x+y)/2-1
,都是算术表达式。
算术表达式的结果是一个算术值。
3.自增与自减运算符
在程序设计中,经常遇到“i=i+1”和“i=i-1”这两种极为常用的 *** 作。
其中,变量i被称为“计数器”,用来记录完成某一 *** 作的次数。
C语言为这种计数器 *** 作提供了两个更为简洁的运算符,即“++”和“- -”,分别称为自增运算符和自减运算符。
它们是从右向左结合的单目算术运算符。
4、在C语言中逗号“,”也是一种运算符,称为逗号运算符。
优先级最低,具有左结合性。
其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。
其一般形式为:
表达式1, 表达式2
其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。
一般格式:
while(循环继续条件)
{ 循环体语句组;}
执行过程:
先判断“循环继续条件”表达式,
再执行“循环体语句组”
一般格式:
do
{ 循环体语句组; }
while(循环继续条件);
执行过程:
先执行“循环体语句组”,
再判断“循环继续条件”表达式
比较:
一般情况,用while循环语句和用do -while循环语句处理问题时,若循环体部分一样,结果也一样。
但是如果while循环语句循环条件一开始为“假”,则循环结果不同。
while循环语句一次也不执行,而do -while循环语句不论条件是否成立,先执行一次循环体语句。
一般格式:
for([变量赋初值];[循环继续条件];[循环变量增值])
{ 循环体语句组;}
执行过程
(1) 求解“变量赋初值”表达式。
(2) 求解“循环继续条件”表达式。
如果其值非0,执行(3);否则,转至(4)。
(3) 执行循环体语句组,并求解“循环变量增值”表达式,然后转向(2)。
(4) 执行for语句的下一条语句。
C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确 定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。
break语句用来结束循环或结束switch语句执行。
语法:break;
说明:(1) 在循环或switch语句中执行break语句,可使程序转到该块结束处继续运行,从而使得循环结束或switch语句结束。
continue语句的作用是结束本次循环,进行下一次循环判定。
语法:continue;
说明:(1)在循环中执行continue语句,程序将转到循环判定条件处继续运行,从而使程序跳过循环体中剩余的语句而强行执行下一次循环。
(2) continue语句用在while、do -while、for等循环体中,常与if条件语句一起使用,用来加速循环。
continue语句与break语句不同,它不终止循环的运行,而只是结束本次循环。
break语句则是强制终止整个循环过程。
在嵌套循环的情况下,continue语句只对包含它的最内层的循环体语句起作用。
break语句也只能终止并跳出最近一层的结构。
数组属于构造类型的数据,构造类型的数据是由基本数据类型按一定规则组成的,因此又称“导出类型”。
数组是有序数据的集合,数组中的每一个元素用数组名和一个序号来确定,且都具有相同的数据类型。
数组在使用之前要对数组的名字、类型及其长度(即数组中元素的个数)进行定义。
定义一维数组的格式如下:
<类型标识符> 数组名[数组长度]
例如:int math[5];
注意:(1)如果在定义数组时只给出了数组的长度并没有赋初值,那么,数组中各元素的值为随机数。
(2) 如果想使一个数组中全部元素值为0,
可以写成:
int math[5]={0};
不能写成:
int math[5]={ 0*5 };
2、多维数组
如果把一维数组形容为线,则可把二维数组形容为面、三维数组形容为立方体。
凡是维数大于1的数组都可称为多维数组。
多维数组的定义格式如下:
<类型标识符> 数组名[第1维长度] [第2维长度] … [第n维长度];
多维数组仍然遵循“按行优先”的存储原则。
1、字符数组
用来存放字符数据的数组,一个元素存放一个字符。
C语言借助字符数组来处理文字。
一维:char 数组名[长度];
例如:char zimu[26];
定义了一个名为zimu,长度为26的字符型数组。
注意:
如果在定义字符数组时不进行初始化,则数组中各元素的 值将是随机的,不可预料的。
如果花括号中提供的初值个数(即字符个数) 大于数组长 度,则按语法错误处理。
2、字符串
“字符串”:用双引号引起来的若干有效字符的序列。
C语言中的字符串可以包括字母、数字、专用字符、转义字符等。
例如,下面都是合法的字符串:
“Happy”;“C program”;“ax+b=y”;“17*16”;
为了测定字符串的实际长度,C语言规定了用空字符“\0”作为“字符串结束标志”。
如果有一个字符串,前面9个字符都不是空字符(即“\0”),而第10个字符是“\0”,则此字符串的有效字符为9个。
也就是说,在遇到字符“\0”时,表示字符串结束,由它前面的字符组成字符串。
一个复杂的问题,可以分解为若干个相对简单的子问题;
解决每个子问题的程序称为子程序。
C语言中,子程序由函数来表示和实现。
函数的定义就是实现,即给定函数的类型与名字、形参的类型与名字、函数体。
/1、函数定义的一般形式
一个C函数由函数头与函数体两部分组成。
形式如下:
类型名 函数名(形式参数表列)
{
说明部分
执行部分
}
例如:
double add(double x, double y)
{ double z;
z= x+y;
return(z);
}
2、return语句
如果用户定义的函数需要返回函数值,则必须使用显式的返回语句向调用者返回一个结果。
函数的返回值是通过函数体中的return语句获得的。
return(表达式);
2、函数的调用
1.函数调用的一般形式
函数名(实际参数表列)
2.函数的调用过程
(1) 为被调函数的形式参数分配内存单元。
(2) 将实参表达式的值依次赋值给对应的形式参数;若是无参函数,则无参数传递过程。
(3) 执行函数体。
先为函数体中定义的变量分配内存单元,再执行函数体中的语句。
执行到return语句时,计算返回值,释放为函数体中变量和形参变量分配的内存空间,返回主调函数继续执行。
3.函数调用的方式
按被调函数在主调函数中出现的位置来分,可以有以下3种函数调用方式:
(1)作为函数语句调用。
这种情况下,函数一般不带返回值。
如 “scanf("%d",&a);”。
(2)作为函数表达式调用。
这种方式要求函数是带返回值的。
如 “z=5 *max(x,y);”。
(3)作为函数参数调用。
这时也要求函数有一个确定的返回值。
如“y=min(99,min(44,22));”。
为了能正确地进行函数的调用,系统需要知道下列信息:
(1) 函数类型。
(2) 函数名。
(3) 函数的参数(个数、类型及顺序)。
这些信息可以组成函数的模型,也称函数原型。
函数原型描述了函数的用户界面。
函数声明一般采用函数原型进行声明:
函数类型 函数名(形参类型1, 形参类型2, …);
或:函数类型 函数名(形式参数表列);
例如:
char letter (char cl,char c2);
或
char letter(char ,char );
函数声明语句的位置应该在函数定义之前。
1、值传递方式
所谓值传递就是函数调用时,系统先计算表达式的值,然后将值传递给形参变量,参数的类型是基本类型(int、char、double等)。
此时,在被调函数中不能修改或引用主调函数中的变量。
如果主调函数只是想把一些值传递给被调函数,对应的参数通常使用值传递方式。
2、地址传递方式
所谓地址传递也是将实参表达式的值赋值给形参变量,但参数的类型是指针类型。
如果希望将主调函数中变量的地址传递给被调函数,那么定义被调函数时,其形参变量应定义为相应的指针类型。
3、返回值方式
函数类型是函数返回值的类型,可以是基本类型、空类型和指针类型。
(1) 返回值为基本类型的函数。
若函数有返回值,则在函数体中至少有一条return语句,用以返回函数值。
(2) 返回值为指针类型的函数
若函数的返回值是指针类型,则函数定义的一般形式为:
函数类型 *函数名(形式参数表列)
{…}
(3) 无返回值的函数。
若函数无返回值,则函数类型应为void类型(空类型)。
这样,系统就保证不使函数带回任何值。
1、嵌套调用
在调用一个函数的过程中,被调用的函数又调用其他函数,这种情况称为函数的嵌套调用 。
2、递归调用
一个函数定义中使用调用形式直接或间接地调用自己就称为递归调用。
1、局部变量
在函数内部(或复合语句内部)定义的变量称为局部变量或内部变量。
局部变量只在本函数(或复合语句)范围内有效,也就是说局部变量的作用域是变量定义所在的函数内(或复合语句内)。
2、全局变量
在函数外部定义的变量称为全局变量或外部变量,全局变量可以为本文件中其他函数所共用,其作用域是从定义或声明的位置开始,直至它所在源程序文件的结束(如果声明在函数内,则只在函数内有效)。
从变量值生存期(即存在时间)将变量分为动态存储变量和静态存储变量。
永久变量是存在于程序运行的全过程的变量,即程序一开始运行就已经生成,一直存在到程序运行结束。
局部的生存期指变量只在程序执行到某个局部时才生成,并在该程序局部结束时被撤消。
C语言提供了一种称为结构体的构造数据类型,它可以将同一个对象的不同类型的属性数据组成一个有联系的整体。
说明:
(1) 结构体名和结构体的成员名遵循C语言标识符的命名规则,建议用具有一定意义的单词或组合来命名。
(2) 结构体成员的类型定义形式同简单变量的定义形式。
(3) 定义结构体类型后,系统并不分配存储空间来存放各个成员。
它的作用在于告诉系统该结构是由哪些类型的成员构成的,并把它们当成一个整体来处理。
只有定义了该结构体类型的变量,系统才会为变量分配存储空间。
一、定义:
1.先定义结构体类型,再定义结构体变量
struct 结构体名
{
成员说明表列
};
struct 结构体名 结构体变量列表;
2.在定义结构体类型的同时定义结构体变量
struct 结构体名
{
成员说明表列
}结构体变量列表;
3.不出现结构体名,直接定义结构体变量
struct
{
成员说明表列
}结构体变量列表;
成员也可以是一个结构体变量。
二、结构体变量的初始化
1.对于结构体类型已经定义的结构体变量的初始化
例如:
struct student
{
long number;
char name[20];
char class[20];
float Math;
float English;
};
struct student stu1={1009, "Lilin", "Tongxin1201", 87, 89};
2.结构体类型定义、结构体变量定义和初始化同时完成
struct student
{
long number;
char name[20];
char class[20];
float Math;
float English;
}stu1={1009, "Lilin", "Tongxin1201", 87, 89};
注意:
不允许直接对结构体变量赋一组常量
若结构体的成员中另有一个结构体类型的变量,则初始化时仍然要对各个基本成员赋初值。
三、结构体变量成员的引用
1.引用结构体变量中的成员
引用结构体变量成员的一般形式为:
结构体变量名.成员名
其中的圆点为成员运算符,它的运算级别是最高的。
2.将结构体变量作为整体引用
只有在两个结构体变量具有相同的结构体类型时,才可以将一个结构体变量作为一个整体赋值给另一个结构体变量。
四、结构体数组
定义结构体数组与定义结构体变量的方法相同
1.先定义结构体类型,再定义结构体数组
struct 结构体名
{
成员说明表列
};
struct 结构体名 数组名[数组大小];
2.在定义结构体类型的同时定义结构体数组
struct 结构体名
{
成员说明表列
}数组名[数组大小];
3.不出现结构体名,直接定义结构体数组
struct
{
成员说明表列
}数组名[数组大小];
五、结构体指针
结构体指针变量定义的一般形式为:
struct 结构体名 *结构体指针变量名;
可以通过结构体指针变量访问结构体变量的成员,访问方式为:
(1)(*结构体指针变量名).成员名
(2) 结构体指针变量名->成员名( “->”是指向成员运算符)
联合体又称为共用体,是将不同类型的数据项存放于同一段内存单元的一种构造数据类型。
联合体类型定义的一般形式为:
union 联合体名
{
成员说明表列
};
union是关键字,是定义联合体类型必不可少的标识符;联合体名是用户定义的标识符。
{}中的内容为联合体成员的类型说明,与结构体类型的成员说明相同。
一、联合体变量的定义
与结构体变量的定义相似,联合体变量的定义也有3种方式。
1.先定义联合体类型,再定义联合体变量
union 联合体名
{
成员说明表列
};
union 联合体名 联合体变量列表;
2.在定义联合体类型的同时定义联合体变量
union 联合体名
{
成员说明表列
}联合体变量列表;
3.不出现联合体名,直接定义联合体变量
union
{
成员说明表列
}联合体变量列表;
二、联合体变量成员的引用
联合体变量成员的引用方法与结构体变量成员的引用方法类似:
联合体变量名.成员名
由于联合体变量不同时具有每个成员的值,因此,最后一个赋予它的值就是联合体变量的值。
此外,C语言允许同类型的联合体变量之间相互赋值。
在C语言代码被执行时,它们都需要被装入到内存储器中,而计算机的内存储器已被划分为一个个的内存单元,存储单元按照一定的规则编号,这个编号称为存储单元的地址。
例:
int i=168, char j=A, double k=3.456766;
在不同的编译环境下,在不同的运行时期,对同一个基本元素都会分配不同的存储空间,也就是会分配到不同的存储空间地址,为了方便开发程序,于是人们就用指针这一新的数据类型来表达不同的存储单元地址空间。
指针变量是一种特殊的变量。
对于指针变量我们只能赋于指针地址。
一、指针变量的定义、初始化
指针变量定义的形式为:
数据类型 *指针变量名1[=初始值],*指针变量名2[=初始值],……;
例如: int i;
float m;
char c;
int *pa_1=&i; //* pa_1是指向int型变量的指针变量)
float *pa_2=&m;//* pa_2是指向float型变量的指针
char *pa_3=&c;//*pa_3是指向char型变量的指针变量
二、指针变量的引用
指针变量经过初始化就会指向一个普通的变量,通过指针变量我们就可以对所指的变量进行各种 *** 作运算。
三、指针变量的使用
1、给所指变量赋值
#include
void main()
{
int *p1, *p2 , a, b;
p1=&a; p2=&b;
scanf(“%d,%d”, p1,p2);
printf(“%d,%d”, a, b);
}
2、改变指针变量的指向来访问不同的变量
例:使两个指针变量交换指向。
#include
main()
{
int *p1 , *p2 ,*p , a, b;
scanf (“%d , %d” , &a , &b);
p1=&a ; p2=&b ; /* p1指向a , p2指向b*/
printf (“%d , %d\n” ,*p1 , *p2
p=p1 ; p1=p2 ; p2=p ; /* p1和p2交换指向*/
printf (“%d ,%d\n” , *p1, *p2); /*输出指针所指向空间的内容*/
}
3、改变所指变量的值
#include
main()
{
Int *p1 , *p2 ,a , b , temp;
scanf (“%d , %d” ,&a , &b );
p1=&a ; p2=&b ; /* p1指向 a , p2指向b*/
printf(“%d , %d\n” ,*p1 , *p2);
temp=*p1 ;
*p1=*p2 ;
*p2=temp ; /*通过p1和p2, ,交换其所指向的变量的值*/
printf(“%d,%d\n”,*p1,*p2);
}
四、指针数组
如果一个数组中的每一个元素都是指针,则称该数组为指针数组,指针数组的定义形式为:
[存储类型] 数据类型 *数组名 [元素个数]
例如:
inr *p [5];
五、多级指针
指向指针的指针变量的声明形式:
类型 **指针变量名;
例如:
int **p ,* s , i=99;
s=&i;
p=&s;
8、宏定义
1、无参宏定义
(1)所谓无参宏就是宏名后不带任何参数。
其定义的格式为:
#define 宏名 字符串(或数值)
其中的“#”表示这是一条预处理命令, C语言中凡是以“#”开头的命令都为预处理命令。
“define”为宏定义命令。
(2)宏定义在使用中应注意以下几点:
a.宏名的前后应有空格。
b.宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名 。
c.宏定义命令其后不要跟分号。
d.字符串(或数值)中如果出现运算符号,则要注意替换后的结果,通常可以在合适的位置加上括号。
e.宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。
如要终止其作用域可使用 #undef 命令。
f.C语言规定,宏名如果出现在字符串常量中或者用双引号括起来的字符串内时,将不作为宏名处理,不对其进行宏替换。
g.宏定义允许嵌套,在宏定义的字符串(或数值)中可以使用已经定义的宏名。
在宏展开时由预处理程序层层代换。
h.习惯上宏名用大写字母表示。
有参宏定义格式:
#define 宏名(形参表) 字符串
有参宏调用格式为:
宏名(实参表)
使用带参的宏定义时需要注意以下几点:
(1)带参宏定义中,宏名和形参表之间不能有空格出现。
例如:
#define MIN(a,b) (a<b)?a:b
如果写成如下的形式:
#define MIN(a,b) (a<b)?a:b /* 代表空格*/
则C语言将认为该宏没有参数,宏名MIN代表字符串
(2)在宏定义中的形参是标识符,而宏调用中的实参可以是常量、变量和表达式。
(3)在宏定义中,字符串内的形参通常要用括号括起来以避免出错。
一般形式为:
#undef 宏名
其中,宏名是在此之前已定义过的。
#undef 的功能是解除前面已经定义的宏,使之不再起作用。
#undef 的另一个作用是重新进行宏定义
C语言规定:符号常量和带参数的宏都不能重复定义,即程序中不能定义同名的宏。
例如,在程序的开头定义了PI是3.14,到程序的另一个地方需要定义PI是3.1415926,使用
#define PI 3.14
...
#define PI 3.1415926
是不允许的。
但是,如果在定义PI为3.1415926之前,用
#undef PI
来解除原先的定义,就可以定义PI为3.1415926。
以上就是今天要讲的内容,本文大致介绍了C语言的部分基础知识,而C语言还有许多功能和特点等待我们去发现,祝大家学业有成。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)