chapter 7 函数与编译预处理
函数与编译预处理

函数与编译预处理一、函数的定义1、无参函数的定义形式类型标识符函数名()第一行:函数首部{声明部分语句 { }包含的:函数体}例1:void fun( ){printf(“Hello!\n”);}2、有参函数的定义形式类型标识符函数名(形式参数列表){声明部分语句}例2:int max(int x, int y){ int z;z = x > y ? x : y;return (z);}注:“类型标识符”是指函数值的类型。
若省略,默认为int。
二、函数的调用无参函数:函数名()有参函数:函数名(实际参数列表)例3:在main函数中调用fun和max函数void main( ){int m,n,t;scanf(“%d,%d”,&m,&n);t=max(m,n); /*调用max函数*/fun(); /*调用fun函数*/printf(“max number is %d\n”,t);}注:1、C语言程序由函数构成,其中有且仅有一个main函数,各函数书写的先后顺序任意。
2、函数的定义是相互独立的,不能在一个函数的内部定义另一个函数,即函数的定义不能嵌套。
3、程序从main函数开始执行,其他函数被调用时执行,调用完后回到主调函数,最后在main函数中结束整个程序。
三、函数的声明在主调函数中一般要对被调函数进行声明。
声明的作用是告知编译器被调函数的函数名、函数类型、参数个数和参数类型,方便进行语法检查。
声明的形式:类型标识符函数名(形式参数列表);即:函数首部加分号例如:void fun( );int max(int x, int y);其中参数名称可省略,如:int max(int , int );Turbo C在以下两种情况中,可省略函数声明:1、被调函数定义在主调函数前。
2、被调函数类型为int、char。
四、参数的传递1、形参是变量,但函数被调用时才被分配内存,调用完毕,所占内存将被释放。
c++第7章

7.3
条件编译
一般情况下,源程序中的所有行均参加编译, 但有时希望部分行在满足一定条件才进行编译,即 对部分内容指定编译的条件,这就是“条件编译” 。 条件编译命令有以下几种形式: 形式一:#ifdef 指令
#ifdef 标识符 程序段1 #else 程序段2 #endif 作用:该标识符在 #define中定义过, 则程序编译时编译 程序段 1 ,否则编 译程序段2。
7.2
文件包含
所谓文件包含是指一个源文件可以将另外一个源 文件的全部内容包含进来, 即将另外文件包含到本文 件之中。利用指令#include可实现这一功能。 文件包含指令的一般格式是: #include <文件名> #include "文件名"
或
作用:预处理时,把“文件名”指定的文件内容 复制到本文件,再对合并后的文件进行编译。
例7.1 输入圆半径,求圆周长、 圆面积、球体积。 #include <iostream> using namespace std ; PI来代替字符串 #define PI 3.1415926 //宏定义 “3.1415926” int main ( ) { double l,s,r,v; cout << "input radius:" << endl; cin >> r; l =2.0*PI*r; s = PI*r*r; v = 4.0/3.0*PI*r*r*r; cout << "l=" << l << endl; cout << "s=" << s << endl; cout << "v=" << v << endl; return 0 ; }
第7章 编译预处理

宏定义的替换文本通常在同一行中,如果替换文本超过一 行,必须在该行的最后加上反斜杠“\”,反斜杠表示替换文 本继续到下一行。 ☆☆ 第7章 编译预处理 12
7.1 宏定义 #define
7.ห้องสมุดไป่ตู้.2 带参宏定义
无参数宏用于定义符号来代替常量,C语言还允许用符号 来定义操作。通过使用参数,可以创建外形和作用都与函数相 似的类函数宏。
例7-5 用定义带参数宏来改写例7-3的程序。 #define PI 3.14 #define C(r) 2*PI*r /*PI是已定义的宏名*/ void main() { double radius,perimeter; 此 处 宏 展 开 为 printf("Enter The Radius\n"); perimeter=2*3.14*radius; scanf("%lf",&radius); perimeter=C(radius); printf("The Perimeter=%lf\n",perimeter); }
量radius,则可以得到圆的周长。两个例子最大的不同在于例73的宏定义要求程序在输入半径时必须使用变量名r,而本例中 程序中的半径变量名可以由用户自定义。 ☆☆ 第7章 编译预处理 14
7.1 宏定义 #define
7.1.2 带参宏定义
本例宏定义括号内的r称为形式参数,将宏调用时出现的变 量名radius称为实际参数,形参和实参可以不止一个。 带参数宏定义的一般形式为: #define 宏名(形参表)替换文本 带参宏调用的一般形式为: 宏名(实参表) 带参宏定义的宏展开步骤可以归纳为下面两步: ① 自左向右依次将替换文本中形参字符用相应位置上的实参 字符来替换; ② 在程序中出现宏调用的位置进行宏展开,这一步与无参宏 定义的宏代换相同。 ☆☆ 第7章 编译预处理 15
函数与编译预处理实验报告

函数与编译预处理实验报告一、实验目的本次实验旨在通过编写程序,掌握函数与编译预处理的相关知识,了解函数的调用和返回机制以及编译预处理的作用。
二、实验环境操作系统:Windows 10开发工具:Code::Blocks 17.12编程语言:C语言三、实验内容1. 函数的定义和调用函数是C语言中的一个重要概念,它可以将一段代码封装成一个功能单元,方便代码重用和维护。
在本次实验中,我们需要掌握如何定义函数,并且了解函数的调用过程。
在C语言中,函数通常由以下几部分组成:返回类型函数名(参数列表){函数体;return 返回值;}其中,返回类型指定了函数返回值的类型;函数名是唯一标识符,用于调用该函数;参数列表指定了该函数需要传入的参数;函数体是一段具体的代码逻辑;return语句则将结果返回给调用者。
在调用一个函数时,我们需要按照以下格式进行:返回值变量 = 函数名(参数列表);其中,返回值变量接收该函数返回的结果;参数列表则按照定义顺序传入相应参数。
如果该函数不需要传入任何参数,则可以省略参数列表。
2. 函数指针除了直接调用一个已经定义好的函数外,我们还可以使用函数指针来间接调用一个函数。
函数指针和普通指针类似,它指向的是一个函数的地址。
通过函数指针,我们可以在运行时动态地确定需要调用哪个函数。
在C语言中,声明一个函数指针的方法如下:返回类型 (*指针变量名)(参数列表);其中,括号中的*表示这是一个指针变量;指针变量名则是该变量的标识符;参数列表和返回类型与被指向的函数相同。
通过以下代码可以将一个已经定义好的函数赋值给一个函数指针:int max(int a, int b){return a > b ? a : b;}int (*p)(int, int) = max;在上述代码中,p就是一个用于存储max函数地址的函数指针。
3. 编译预处理编译预处理是C语言中一项重要的功能,在编译过程中会对源代码进行一些预处理操作。
C语言程序设计之程序编译预处理介绍课件

演讲人
01.
02.
03.
04.
目录
编译预处理的概念
编译预处理的指令
编译预处理的应用
编译预处理的注意事项
编译预处理的概念
编译预处理的作用
提高程序的可读性和可维护性
提高程序的编译效率
提高程序的可移植性
提高程序的安全性和健理指令,如#include、#define等
预定义宏:使用预定义宏可以方便地获取系统信息,提高程序的可移植性和适应性。
04
文件包含:使用文件包含可以方便地组织代码,提高程序的模块化和可重用性。
03
条件编译:使用条件编译可以控制代码的编译和运行,提高程序的灵活性和可移植性。
02
宏定义:使用宏定义可以简化代码,提高程序的可读性和可维护性。
01
模块化编程
优点:便于修改和维护代码
缺点:增加了编译时间
缺点:可能导致代码可读性降低
编译预处理的指令
宏定义指令
#define指令:用于定义宏,在编译时进行替换
#undef指令:用于取消宏定义
#ifdef指令:用于判断宏是否定义
#ifndef指令:用于判断宏是否未定义
#else指令:用于定义未定义宏时的处理
#endif指令:用于结束条件编译块
#error指令:用于在编译时输出错误信息
#pragma指令:用于向编译器传递一些信息,如警告信息等
#line指令:用于指定下一行代码的行号
#include指令:用于包含其他头文件
#ifdef:如果定义了指定的宏,则编译后面的代码#ifndef:如果没有定义指定的宏,则编译后面的代码#else:与#ifdef或#ifndef配合使用,表示如果没有满足条件,则编译后面的代码#endif:结束条件编译指令#undef:取消已定义的宏#error:当满足条件时,输出错误信息并停止编译#line:指定下一行代码的行号和文件名#pragma:用于向编译器传递一些特定的信息,如警告信息等
函数与编译预处理实验报告

函数与编译预处理实验报告1. 背景函数与编译预处理是计算机编程中非常重要的两个概念,它们对于程序的结构和执行效率都起着关键作用。
函数是一段可重复使用的代码块,通过将任务划分为多个函数可以提高代码的可读性与维护性。
而编译预处理则是在编译过程中对源代码进行预处理,包括宏展开、文件包含和条件编译等操作。
本次实验通过设计并实现一段使用函数和编译预处理的程序,旨在加深对函数和编译预处理的理解,掌握它们的基本概念和使用方法,并通过实践感受它们对程序结构和性能的影响。
2. 分析2.1 需求在实验中,我们需要设计一个问题,通过函数和编译预处理来实现对问题的解决。
首先,我们需要确定问题的具体要求和输入输出规范。
只有明确了问题的需求,才能设计出合适的函数和合理的编译预处理指令。
2.2 设计根据实验要求,我们可以设计一个简单的问题:计算一个整数的平方。
用户输入一个整数,程序输出该整数的平方。
这是一个简单的计算问题,可以通过函数和编译预处理来实现。
我们可以设计一个函数calculate_square用于计算平方,并通过编译预处理指令来实现输入输出的控制。
具体的实现细节如下:#include <stdio.h>// 函数:计算平方int calculate_square(int x) {return x * x;}// 编译预处理指令:实现输入输出控制#define ENABLE_INPUT_OUTPUT#ifdef ENABLE_INPUT_OUTPUTint main() {int num;printf("Please enter an integer: ");scanf("%d", &num);int result = calculate_square(num);printf("The square of %d is %d.\n", num, result);return 0;}#endif上述代码中,我们定义了一个函数calculate_square用于计算整数的平方。
C语言-第7章-函数与编译预处理

虚实结合。
有关形参和实参的说明:
14
① 当函数被调用时才给形参分配内存单元。调用结 束,所占内存被释放。
② 实参可以是常量、变量或表达式,但要求它们有 确定的值。
③ 实参与形参类型要一致。
④ 实参与形参的个数必须相等。在函数调用时,实 参的值赋给与之相对应的形参。“单向值传递” 。
2.函数的类型与函数的返回值
swap(a,b); }
main( ) {… c=max(a,b); }
函数中或主调函数之前对被 调函数进行声明。
max(int x, int y) { …}
对被调用函数的说明
19
如果使用库函数,应在文件开头用#include命令将调用库函 数所需的信息包含到文件中来。
如果使用用户自己定义的函数,一般应在主调函数中对被调用 函数作类型说明。
1200
2100
z=x; x=y; y=z;
x
y
printf("\nx=%d,y=%d",x ,y);
}
main( )
swap函数在调用时,形
{ int a= 10,b=20;
参x,y才被分配存储空间,
swap(a,b); printf("\na=%d,b=%d\n",a,b); }
从main函数中分别获实 参传递的值10,20,此为
void sort ( int b[ ] , int n ) { int i,j,t;
sort(a,10);
for (i=1; i<n; i++)
printf("After sort:\n"); for (j=0; j<n-i; j++ )
编译预处理

(2)#ifdef 标识符 程序段 1 #else 程序段2
它的作用是若是标识符未被定义过则编译程序段1,否则 编译程序段2。
(3)#if 表达式 程序段1 #else 程序段2 #endif
它的作用是当指定的表达式值为真(非零)时就编译程 序段1,否则编译程序段2
例 在替换文本中对形参进行替换。
#include <math.h>
#define P(x) printf("The square root of " #x " is %.2lf\n",sqrt(x))
void main()
{ double m=4; P(m); P(2+7);
程序运行结果: The square root of m is 2.00 The square root of 2+7 is 3.00
补充
带参宏定义的宏展开步骤可以归纳为下面两步: ① 自左向右依次将替换文本中形参字符用相应位置上的实参 字符来替换; ② 在程序中出现宏调用的位置进行宏展开,这一步与无参宏 定义的宏代换相同。
带参宏定义
宏的参数用圆括号括起来,宏名与参数表间不能有空格,否 则将作为无参数宏来处理,把括号和参数列表也作为替代文本 的一部分。但是在替代文本中可以使用空格,也允许在参数列 表中使用空格。
形参和实参是两个不同的量,有各自的作用域,调用时要 把实参值赋予形参,进行“值传递”。而带参宏只是简单的 字符代换,不存在值传递的问题。
函数调用和宏调用二者在形式上相似,在本质上是完全不 同的。现将它们的区别归纳如表所示:
区别项目
函数
信息传递
实参的值或地址传送给 形参。
处理时刻、内 程序运行时处理,分配 存分配情况 临时内存单元。
C程序设计 第7章 函数与编译预处理

将一个正整数以二进制数的形式输出
void bin ( int x) { if(x/2>0) bin(x/2); printf("%d",x%2); } main ( ) { bin(12);} 运行结果: 1100
函数调用方式
数组元素可以作为实参,此时数组元素相当于 普通变量,为传值调用。实参对形参的数据传 递是单向传递,形参的值发生改变,并不会改 变主调函数实参的值。 数组名可以作为函数的形参和实参,数组名做 函数参数时,传递的是实参数组的首地址,结 果实参数组和形参数组使用同一段内存单元。
交换变量的值
函数的定义
类型 函数名(类型 形参1,类型 形参2,…… ) { 声明语句 执行语句 } 说明:形参用于接收主调函数传来的数据,如果不 需要则可以在括号中写void;类型指函数返回值 的类型,如果函数不返回值,则类型是void。
例
main ( ) { void pp(void); /*函数声明*/ printf(" Hello !\n"); pp(); pp(); } void pp(void ) { printf(“$$$$$$$$$$$$$$\n"); } 运行结果: Hello ! $$$$$$$$$$$$$$ $$$$$$$$$$$$$$
第7章 函数与编译预处理
函数基础 函数嵌套调用 函数调用方式 局部变量和全局变量 动态变量和静态变量 宏定义 文件包含
函数
C语言使用函数实现特定的功能。 一个源程序文件是独立的编译单位,由函 数组成。 函数之间相互独立,除main函数不能被 调用外,其它函数可以互相调用。 函数分为库函数和自定义函数。
C语言课件—编译预处理

#include <stdio.h> #define sqr(x) ((x)*(x))
#include "powers.h" #define cube(x) ((x)*(x)*(x))
void main() { int n调;试方法
#define quad(x) ((x)*(x)*(x)*(x))
print1f.("n编u辑mpboerw\teersx.ph2,保\t e存xp3\t exp4\n");
❖宏体及各形参外一般应加括号()
例 #define POWER(x) x*x
x=4; y=6;
z=POWER(x+y); 宏展开:z=x+y*x+y; 一般写成: #define POWER(x) 宏展开: z=((x+y)*(x+y));
((x)*(x))
Macro Definition
例. 带参数的宏与函数实现同样功能
第七章 编译预处理
概述 宏定义 文件包含 条件编译
Next chapter
Introduction
作用:编译程序的一部分,将特殊命令扩展到程 序中,生成扩展C源程序
种类
❖宏定义 #define ❖文件包含 #include ❖条件编译 #if--#else--#endif
格式:
❖“#”开头 ❖占单独书写行 ❖语句尾不加分号; ❖定义位置任意,决定其作用域
print2f.("-将---p\to-w---e\tr-s--.h--文\t-件---存--\n放"到); 某一目录下
for(n3=. 1;编n<辑=fMmAaXin;.nc,++将) powers.h包含进来
函数与预编译处理

#include<stdio.h> int max(int x,int y) { return x>y?x:y; } void main() { int a,b,c,m; printf ("请输入3个整数:\n"); scanf("%d%d%d",&a,&b,&c); m=max(c,max(a,b)); printf ("m=%d\n",m); }
【例6.5】 求1!+2!+3!+4!+5!。
#include<stdio.h> /* 不是语句,末尾不加分号 */ int fact(int n) /* 求n!函数 */ { int j,f=1 ; for(j=1;j<=n;j++) f=f*j ; return f; /* 返回main函数 */ } void main() { int k, sum=0 ; for(k=1;k<=5;k++) sum=sum+fact(k); printf("sum=%d\n",sum); }
#include<stdio.h> void main() { float x, y; int n ; float power(float x,int n); /* power()函数的提前声明 */ scanf("%f%d", &x,&n); y=power(x, n); printf("y=%.2f\n", y ); } float power(float x,int n) { int i; float t=1; for(i=1;i<=n;i++) t=t*x; return t; }
函数与编译预处理

例6.3 用递归方法计算n!。
long fact(int n) { if(n==0||n==1) return 1; else return n*fact(n-1); } main() { int n; long m; scanf("%d",&n); m=fact(n); printf("%d!=%ld\n",n,m); }
程序举例
1.以下程序的输出结果是 #define M(x,y,z) x*y+z main() {int a=1,b=2,c=3; printf(“%d\n”,M(a+b,b+c,c+a)); }
计算过程: 1+2*2+3+3+1=12
4+4*4+4/2+2*2+2=28
有以下程序执行后输出结果是 #define f(x) x*x main() {int i; i=f(4+4)/f(2+2); printf(“%d\n”,i); }
2.带参数的宏定义
带参数的宏定义的一般形式为: #define 宏名(形参表) 字符串 对带参数的宏,在调用时,不仅要宏展开,而且要用实参去代换形参。 带参数宏调用的一般形式为:宏名(实参表); #define MAX(x,y) x>y?x:y main() { int a,b,m; scanf("%d%d",&a,&b); m=MAX(a,b); printf("max=%d\n",m);
全局变量和局部变量的使用特点 变量存储类别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.6 函数的递归调用
【例7-8】利用递归计算xy。
【例7-9】利用递归计算Fabonacci数列第n项的值。
7.7
数组做函数的参数
数组同变量一样可以作为函数的参数使用,进行 数据传送。数组用作函数参数有两种形式:
1.数组元素作函数实参
数组元素就是下标变量,它与普通变量并无区 别。因此它作为函数实参使用与普通变量是完全相 同的,在函数调用时,把作为实参的数组元素的值 传送给形参,实现单向的值传送。
束,将数组作为函数参数,求平均值。
【例7-12】用函数实现将一个3行4列的数组输出。
7.8.1 局部变量
局部变量在函数体内作定义说明后,其有效范 围只在该函数内,离开该函数后将不能再被使用。 说明: 1.主函数中定义的变量不能在其它函数中使用,主 函数中也不能使用其它函数中定义的变量。因为 主函数也是一个函数,它与其它函数是平行的。 2.形参变量是属于被调函数的局部变量,实参变量 是属于主调函数的局部变量。因此在不同函数中 可以使用相同的变量名,它们代表不同的对象、 单元和内存空间,互不干扰。
1.内部函数 若一个源文件中的函数,只能被该源文件中的其
它函数所调用,称之为内部函数。内部函数又称为静
态函数,其定义的一般格式为: static 类型标识符 函数名(形参表列) {函数体} 例如:static int f(int n){ …… }
7.8.8 内部函数与外部函数
2.外部函数 若一个函数,不仅能够被它所在的源文件中的其 它函数所调用,还能够被其它源文件中的函数调用, 这样的函数称为外部函数,其定义的一般格式为: extern 类型标识符 函数名(形参表列) {函数体} 说明:自定义函数均默认为外部函数,对外部函数的 引用也必须先进行声明,声明格式为: extern 类型标识符 函数名(形参表列);
【例7-2】定义一个输出两个数中最大值的有参数。
7.3.1 函数调用的一般形式
C语言中函数调用的一般形式为: 函数名([实参列表]);
说明:
① 对无参函数调用时则无实参列表。 ② 对有参函数来说实际参数表中的参数可以是常 量、变量、表达式或其它构造类型数据及表达 式,各实参之间用逗号分隔。
7.3.2 函数调用的方式
函数定义的一般形式
函数定义就是编写实现函数功能的程序块,其一 般形式如下: 类型标识符 函数名([形参列表]) { 函数体 } 说明:类型标识符指函数的返回值类型,函数名可以 是任意合法的C标识符,形参列表可以省略,如有 多个形参,中间必须用","隔开
7.2
函数定义的一般形式
【例7-1】定义一个输出10个'*'的无参函数。
7.1 函数概述
从函数功能这个角度看,又可把函数分为有返 回值函数和无返回值函数两种。 ①有返回值函数:此类函数被调用执行完后将向调 用者返回一个执行结果,称为函数返回值。如 sqrt、pow等。由用户定义的这种函数,必须在 函数定义和函数说明中明确返回值的类型。 ②无返回值函数:此类函数用于完成某项特定的处 理任务,完成后不向调用者返回函数值。由于函 数无须返回值,因此可指定它的返回为空, 说 明符为void。
7.1 函数概述
从主调函数和被调函数之间数据传送的角度看, 又可分为无参函数和有参函数两种。 ①无参函数:函数定义、函数说明及函数调用中均不 带参数。此类函数通常用来完成一些指定的功能, 可以返回或不返回函数值。 ②有参函数:在函数定义及函数说明时都有参数,称 为形式参数(简称为形参)。在函数调用时也必须给 出参数,称为实际参数(简称为实参)。函数调用时, 主调函数将把实参的值传送给形参,供被调函数使 用。
7.1 函数概述
注意: 在C语言中,所有的函数定义都是平行的。即
在一个函数的函数体内,不能再定义另一个函数。
但是函数之间允许相互调用,也允许嵌套调用,并 且习惯上把调用者称为主调函数。函数还可以自己 调用自己,称为递归调用。 主函数main( ),它可以调用其它函数,而不允
许被其它函数调用。
7.2
③ 在主函数中调用SumFac
7.6 函数的递归调用
一个函数在它的函数体内调用它自身称为递归 调用,这种函数称为递归函数。递归调用是将一个
复杂的问题,被一个规模更小、更简单的类似问题
替代了,经过逐步分解,最后得到一个非常容易解
决的类似问题,将该问题解决后,再逐层解决上一
级问题,最后解决了较复杂的原来的问题。
C语言中可以用以下几种方式调用函数: ①表达式调用:函数作为表达式中的一项出现在表 达式中,用返回值参与表达式的运算。这种方式 要求函数是有返回值的。 ②函数语句:函数调用的一般形式加上分号即构成 函数语句。 ③函数实参:函数作为另一个函数调用的实际参数 出现,即把该函数的返回值作为实参进行传送, 因此要求该函数必须是有返回值的。
可能出现的错误。
7.4.1 形参和实参
形参和实参的功能是值传送。发生函数调用时,
主调函数把实参的值传送给被调函数的形参从而实现
主调函数向被调函数的数据传送。 形参和实参具有以下特点: ① 形参变量只有在被调用时才分配内存单元,在调 用结束时,即刻释放所分配的内存单元。因此形 参只有在自定义函数内部有效。
7.5
函数的嵌套调用
C语言允许在一个函数的定义中出现对另一个函 数的调用,这样就出现了函数的嵌套调用,即在被 调函数中又调用其它函数。
7.5
函数的嵌套调用
【例7-7】输入一个正整数n,计算1!+2!+3!+...+n!,
要求用嵌套函数来完成。
提示:① 定义函数long Fac(n)求n!
② 定义函数long SumFac(n)求1!+...+n!
7.9.1 不带参数的宏定义
不带参数的宏定义也称为无参的宏定义,其定 义的一般形式为: #define 标识符 字符串 说明: 1.“#”表示预处理命令,“define”为宏定义命令。 2.“标识符”简称宏名,应遵循C语言标识符的命名 规则,一般用大写字母表示。 3.“字符串”可以是常量、表达式、格式串等等。 4.执行过程:预处理程序是将把所有宏名逐一替换 成相应的字符串。
7.8.5 用static声明局部变量
关键字static声明的局部变量为“静态局部变 量”,这种变量的值在函数调用结束后保留原值。 static型变量的说明:
1.static型变量属于静态存储类别,在静态存储区
内分配存储单元,在程序运行期间都不释放。 2.static型变量在编译时赋初值,并只赋一次; 3.如果在定义static型变量时不赋初值,则编译时 自动赋初值0或空字符。
7.4.2 函数的返回值
对return语句的几点说明: 1.在函数中允许有多个return语句,但每次只能有 一 个return语句被执行。 2.返回值的类型和函数的类型应保持一致。如不一 致 则以函数类型为准,自动进行类型转换。 3.不返回函数值的函数,应明确定义为"void"类型, 表示不返回任何值。例如语句int c=max(x,y);如 果max被定义为void类型,则该语句就是错误的。 4.如函数为整型,在函数定义时可以省去类型说明。
7.3.3 对被调函数的声明
函数与变量一样,也遵循“先定义后使用”原则。
对被调函数作说明是使编译系统知道被调函数返回值 的类型,以便在主调函数中按此种类型对返回值作相 应的处理。函数声明一般形式为: 类型说明符 被调函数名(形参列表); 说明:形参列表包括形参类型和名称,也可以只给出 形参类型。这便于编译系统进行检错,以防止
程序文件,其作用域是整个源程序。在函数中使用
全局变量,一般应作全局变量说明。全局变量的说
明符为extern,一般形式如下:
extern 类型说明符 变量名
7.8.2 全局变量
注意:
① 在一个函数之前定义的全局变量,在该函数内使
用可不再加以说明。
② 如果同一个源文件中,外部变量与局部变量同
名,则在局部变量的作用范围内,外部变量将被
7.8.1 局部变量
3.在复合语句中也可定义变量,其作用域只在复合 语句范围内。例如:
main() { int s,a; …… { int b; s=a+b; …… } …… }
s、a的作用域
b的作用域
7.8.2 全局变量
全局变量也称为外部变量,它是在函数外部定
义的变量,它不属于任意一个函数,而属于一个源
7.9.1 不带参数的宏定义
思考下面两个程序的结果 ① #define HI hello main() { printf("HI"); } } { printf("%d", 2*X); ② #define X 2+3 main()
7.4.2 函数的返回值
函数完成工作后返回主调函数称为函数返回。函 数能将计算结果返回给主调函数,这个结果即是函数
的返回值,并且其类型要与函数类型相同。
函数的值只能通过return语句返回,其一般形式 为:return 表达式;,功能为计算表达式的值,并
返回给主调函数。
【例7-5】输入一个正整数n,输出n!。要求n!用自定 义函数计算。
数的形参变量的类型一致即可。
② 用数组名作函数参数时,要求形参和实参都必须 是类型相同的数组,否则会发生错误。 ③ 用数组名作函数参数时,编译系统是将实参数组 的首地址赋予形参数组名,因此形参数组和实参
数组拥有同一段内存空间。
7.7
数组做函数的参数
【例7-10】输出一个整数数组中所有大于0的元素。 【例7-11】输入n个数存入一个数组a中,输入0结
ห้องสมุดไป่ตู้
7.4.1 形参和实参
② 实参可以是常量、变量、表达式、函数等,在进 行函数调用时,它们都必须具有确定的值。因此 应预先用赋值、输入等办法使实参获得确定值。 ③ 实参和形参在数量、类型、顺序上一一对应,否 则会发生的错误。 ④ 函数调用中数据传送是单向的,即只能把实参的 值传送给形参,而不能把形参的值反向地传送给 实参。因此在函数调用过程中,形参的值发生改 变,而实参中的值不会变化。