扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
求 3 -- n 之间所有素数之和
成都创新互联公司专业提供成都服务器托管服务,为用户提供五星数据中心、电信、双线接入解决方案,用户可自行在线购买成都服务器托管服务,并享受7*24小时金牌售后服务。
double fun(int n) {
int m,k,i;
double s = 0.0;
for(m = 3; m = n; m++) { // 从 3 开始,到n
k = sqrt(m); // k * k = m,考虑到效率,只需用其平方根去除
for(i = 2;i = k;i++) // 用 i m 也是同样结果
if(m%i == 0) break; // 能真出的就不是素数
if(i = k + 1) s += sqrt(m); // 不是因break结束循环,就是素数
}
return s;
}
7.8 内部函数及外部函数
根据函数能否被其他源程序文件所调用,可将函数分为内部函数和外部函数。
1.内部函数
内部函数是指一个函数只能由定义它的源程序文件所调用,内部函数又称为静态函数。
格式:static类标函数名(类型名 形参数1,类型名 形参数2,…)
上面的定义格式中,static用于说明函数为内部函数。
2.外部函数
外部函数是指可以被其他源程序所调用的函数。
格式[extern]类型标识符 函数名(类型名 形参数1,类型名 形参数2,…)
上面定义格式中,extern表明所定义的函数为外部函数,当extern被省略时,隐含为外部函数。
注意:在要调用此函数的源程序文件中,一般要用extern标识符说明所用的函数为外部函数。
7.1 库函数的正确调用
1.C语言提供了丰富的库函数,包括常用数学函数、对字符和字符串处理函数、输入输出处理函数等。在调用库函数时要注意以下几点:
(1)调用C语言标准库函数时必须在源程序中用include命令,include命令的格式是:
#include″头文件名″
include命令必须以#号开头,系统提供的头文件名都以.h作为后缀,头文件名用一对双引号″″或一对尖括号〈〉括起来。
(2)标准库函数的调用形式:
函数名(参数表)
2.在C语言中库函数的调用可以以两种形式出现:出现在表达式中;作为独立的语句完成某种操作。
7.2 函数的定义方法
1.C语言函数的一般形式为:
函数返回值的类型名 函数名(类型名 形参1,类型名 形参2,…)
{
说明部分
语句部分
}
定义的第一行是函数的首部,{}中的是函数体。
2.在老的C语言版本中,函数的首部用以下形式:
函数返回值的类型名 函数名(形参1,形参2…)
形参类型说明;
新的ANSI标准C兼容这种形式的函数首部说明。
3.函数名和形参名是由用户命名的标识符。在同一程序中,函数名必须。形式参数名只要在同一函数中即可,可以与函数中的变量同名。
4.C语言规定不能在一个函数内部再定义函数。
5.若在函数的首部省略了函数返回值的类型名,把函数的首部写成:
函数名(类型名 形参1,类型名 形参2,…)
则C默认函数返回值的类型为int类型。
6.当没有形参时,函数名后面的一对圆括号不能省略。
7.3 函数的类型和返回值
1.函数的类型由函数定义中的函数返回值的类型名确定,函数的类型可以是任何简单类型,如整型、字符型、指针型、双精度型等,它指出了函数返回值的具体类型。当函数返回的是整型值时,可以省略函数类型名。当函数只完成特定的操作而没有或不需要返回值时,可用类型名void(空类型)。
2.函数返回值就是return语句中表达式的值。当程序执行到return语句时,程序的流程就返回到调用该函数的地方(通常称为退出调用函数),并带回函数值。
7.4 形式参数与实际参数,参数值的传递
1.在函数定义中,出现的参数名称为形参(形式参数),在调用函数时,使用的参数值称为实参(实际参数)。
2.调用函数和被调用函数之间的参数值的传递是″按值″进行的,即数据只能从实参单向传递给形参。也就是说,当简单变量作为实参时,用户不能在函数中改变对应实参的值。
7.5 函数的正确调用(嵌套调用,递归调用)
1.调用函数时,函数名必须与被调用的函数名字完全一样。实参的个数与类型和形参的个数与类型一致。
2.C语言规定:函数必须先定义,后调用,也就是被调用函数必须在调用之前加以说明,或被调用函数整个放在调用函数之前。但对返回值类型为int或char类型的函数可以放在调用函数的后面。
3.C语言中函数定义都是互相平行、独立的,C语言不允许嵌套定义函数,但允许嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数。
4.在C程序中,调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。
5.递归调用函数是C语言的特点之一,有时递归调用会使求解的问题变得更简单明了。
7.6 局部变量和全局变量
1.局部变量
在一函数内部所定义的变量称为局部变量,局部变量只在本函数范围内有效。
注意:
①不同函数可以使用相同的局部变量名,它们将代表不同的对象,互不干扰;
②一个函数的形参也为局部变量;
③在函数内部,复合语句也可定义变量,这些变量也为局部变量,只在此复合语句中有效。
2.全局变量
在C语言中,程序的编译单位是源程序文件,一个源程序文件中包含一个或多个函数。在函数之外所定义的变量称为外部变量,也称为全局变量。全局变量可以被包含它的源程序文件中的其他函数所共用,作用域为从定义变量的位置开始到源程序文件结束,全局变量可以增加函数之间数据的联系。
注意:当在同一个源程序文件中,全局变量与局部变量同名时,在局部变量的作用范围内,全局变量不起作用,局部变量起作用。
7.7 变量的存储类别、作用域及生存期
1.变量的存储类别
在C语言中,有两类存储类别:自动类别及静态类别。
有4个与两种存储类别有关的说明符:auto(自动)、register(寄存器)、static(静态)和extern(外部),这些说明符一般与类型说明一起出现,一般放在类型名的左边,例如:
auto long I,j;
也可写成:
long auto I,j;
(1)自动变量:自动变量是C程序中使用最多的一种变量,这种变量的建立和撤消都是在系统中自动进行的。
格式:[auto]数据类型 变量名[=初始化表达式],…;
上面的说明格式中,方括号中是可省略的部分,auto为自动类别标识符,若省略auto,系统缺省的存储类别也为自动类别。
注意:函数的形参也为自动类别,在定义时不必加存储类别标识符。
(2)寄存器变量:寄存器变量与自动变量的性质相同,其区别只在于存储的位置不同,寄存器变量存储在CPU的寄存器中,而自动变量存储在内存中的动态存储区,寄存器变量的存取速度要快些。
格式:register数据类型,变量名[=初始化表达式],…;
上面的说明格式中,register为寄存器变量的存储类别标识符。
说明:
①CPU中寄存器的数目是有限的,因此只能把少数的变量说明为寄存器变量;
②寄存器变量是存放在寄存器中的,而不是存放于内存中,所以,寄存器变量无地址;
③寄存器变量的说明应尽量放在靠近要使用的地方,用完后尽快释放,这样可提高使用效率。
(3)静态变量:静态类别变量的存储空间在程序的整个运行期间是固定的。
格式:static数据类型 变量名[=初始化表达式],…;
在上面的说明格式中,static为静态变量的存储类别标识符。
静态变量的初始化在编译时进行,定义时可用常量或表达式进行显式初始化。对于没有初始化的静态变量,自动初始化为0(整型)或0.0(实型)。
注意:静态变量具有可继承性,这与自动变量有所不同。
(4)外部变量:使用extern可使外部变量使用范围扩充到需要使用它的函数。外部变量可作显式的初始化,若不作初始化,系统将自动地初始化为0或0.0。
格式:[extern]数据类型,变量名[=初始化表达式],…;
上面的说明格式中,extern使外部变量的作用范围扩大到其他源程序文件中。
注意:局部变量既可以说明为自动类别,也可以说明为静态类别;全局变量只能说明为静态类别。
2.变量的作用域及生存期
在C语言中,变量必须先说明后使用,在程序中一个已定义的变量的使用范围就是此变量的作用域。经过赋值的变量在程序运行期间能保持其值的时间范围为该变量的生存期。
(1)局部变量的使用域及生存期
①自动变量的使用域及生存期
自动变量的存储单元被分配在内存的动态存储区,每当进函数体(或复合语句)时,系统自动为自动变量分配存储单元,退出时自动释放这些存储单元。自动变量的作用域为从定义的位置起,到函数体(或复合语句)结束为止。
自动变量在进入到定义它们的函数体(或复合语句)时生成,在退出所在的函数体(或复合语句)时消失,这就是自动变量的生存期。
使用自动变量的优点是使各函数之间造成信息分隔,不同函数中使用同名变量时不会相互影响。
②寄存器变量的使用域及生存期
寄存器变量的使用域及生存期与自动变量相同。
③静态存储类别的局部变量
在函数体(或复合语句)内部,用static说明的变量静态存储类别的局部变量,这种变量的作用域与自动(或寄存器)变量的作用域相同,但是生存期有所不同。
在整个程序运行期间,静态局部变量在内存的静态存储区中占据着永久的存储单元,甚至在退出函数后下次再进入函数时,静态局部变量仍使用原来的存储单元。由于不释放存储单元,所以这些存储单元中的值将会被保留下来。静态局部变量的生存期将一直延长到程序运行结束。
静态局部变量适合于在函数调用之间必须保留局部变量值的独立变量。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流