什么是C语言程序设计?

什么是C语言程序设计?,第1张

什么是C语言?C语言的简介。

C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。

它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用棚嫌程序设计语言,编写不依赖计算机硬件的应用程序。

因此,它的应用范围广泛,不仅仅是在软件开发上,而且各类科研都需要用到C语言,梁丛具体应用比如单片机以及嵌入式系统开发。

语言特点:C是中级语言/C是结构式语言/C语言功能齐全/C语言适用范围大/简洁紧凑、灵活方便/运算符丰富/数据类型丰富/C是结构式语言/语法限制不太严格,程序设计自由度大/适用范围橡和樱大,可移植性好。

在介绍C语言的宏定义之前,需要介绍一下预处理。

什么是预处理呢?所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所做的工作。预处理是C语言的一个重要的功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动灶蔽引用预处理程序对源程序中的预处理部分作处理,处理完毕后自动进入对源程序的编译。

程序中以“#”开头的预处理命令,如包含命令#include,宏定义命令#define等。在源程序中这些命令都放在函数之外,一般放在源文件的前面,称为预处理部分。宏定义就是预处理的一种。

C语言中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在预编译处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。

C语言的“宏”分为有参数和无参数两种,下面对这两种“宏”分别进行讨论。

1、无参宏定义

无参宏的宏名后不带参数。

其定义的一般形式为:#define 标识符 字符串

“标识符”为所定义的宏名,“字符串”可以是常数、表达式、格式串等。

例如:

#define M (x*x+2*x+1)

它的作用是指定标识符M来代替表达式(x*x+2*x+1)。在编写源程序时,所有的(x*x+2*x+1)都可以由M代替。而对源程序作编译时,将先由预处理程序进行宏代换,即用(x*x+2*x+1)表达式去置换所有的宏名M,然后再进行编译。

例如:

#include <stdio.h>

#define M (x*x+2*x+1)

main()

{

int sum,x

printf("input a number: ")

scanf("%d",&x)

sum=3*M+4*M+5*M

printf("sum=%d\n",sum)

}

上例程序先用宏定义M来替代表达式(x*x+2*x+1),在sum=3*M+4*M+5*M中作了宏调用。在预处理时经宏展开后该语句变为sum=3*(x*x+2*x+1)+4*(x*x+2*x+1)+5*M(x*x+2*x+1)。

对于宏定义需要注意一下几点:

1)宏定义是用宏名来表示一个字符串,在宏展开时,又以该字符串取代宏名,这只是一种简单的代换,字符串中可以包含任何字符,可以是常数,也可以是表达式,预处理唤汪程序不对它作任何检查。如有错误,只能在编译已被宏展开后的的源程序时发现。

2)宏定义不是说明或语句,在行末不需加分号,若加了分号则连分号一起置换。

3)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。

例如:

#define PI 3.1415926

main()

{

...

}

#undef PI

f1()

{

...

}

表示PI只在main函数中有效,在f1中无效。

4)宏名若在程序中用引号括起来,则预处理程序不对其作宏代换。

5)宏定义允许嵌套,在宏定义的字符串中可以使用已定义的宏名。在宏展开时,由预处理程序层层代换。

6)习惯上宏名用大写字母表示,以区分变量。当然也可以用小写字母表示。

7)可以用宏定义表示数据类型,使书写方便。

例如:

#define U8 unsigned int

注意宏定义表示数据类型和用typedef定义数据说明符的区别:宏定义只是简单的和辩仔字符串代换,是在预处理完成的;而typedef是在编译时处理的,它不是做简单的代换,而是对类型说明符重新命名,被命名的标识符具有类型定义说明的功能。

2、带参宏定义

在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。

对带参的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。

带参宏定义的一般形式为:

#define 宏名(形参表) 字符串

在字符串中含有各个形参。

带参宏调用的一般形式为:

宏名(实参表);

例如:

#define M(y) y*y+3y/*宏定义*/

...

k=M(5) /*宏调用*/

...

在宏调用时,用实参5去替代形参y,经预处理宏展开后的语句为:

k=5*5+3*5

例如:用带参宏来获取较大数

#define MAX(a,b) (a>b)?a:b

对于带参宏需要注意以下几点:

1)带参宏定义中,宏名和形参表之间不能有空格出现。

2)在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参由具体的值,要用它们去代换形参,因此必须作类型声明。这只是符号代换,不存在值传递的问题。

3)在宏定义中形参是标识符,而宏调用中的实参可以是表达式。

4)在宏定义中,字符串内的形参通常要用括号括起来以免出错。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12569302.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存