前言
关于函数相关的选择题。
题目一:
C语言规定,在一个源程序中,main函数的位置( )
A .必须在最开始
B .必须在库函数的后面
C .可以任意
D .必须在最后
题解:选择C。
- main函数为C语言中整个工程的程序入口,对于定义位置是没有要求的。
- main函数有且只有一个,当运行程序时,编译器会自动进行扫描,找到main函数,进入main函数,开始执行代码。
题目二:
关于C语言函数描述正确的是:( )
A .函数必须有参数和返回值
B .函数的实参只能是变量
C .库函数的使用必须要包含对应的头文件
D .有了库函数就不需要自定函数了
题解:选择C。
- 选项A的错因。C语言中函数可以没有参数和返回值,当没有参数没有返回值时,称为无参无返回值函数,这是C语言允许的,但要注意,函数不能没有函数名。
- 选项B的错因。C语言中函数的实参可以时变量、常量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。也就是说,当实参为表达式、函数之类的,必须要确认清楚是否有确定的值,如函数当成另一个函数的参数时,需要确认清楚该函数是否有返回值。
- 选项C是正确的。使用库函数必须要包含对应的头文件。
- 选项D的错因。在C语言中可以分为两类,分别为库函数和自定义函数,库函数由官方提供,自定义函数由自己提供,自定义函数在C语言中占据举足轻重的地位。
题目三:
以下叙述中不正确的是:( )
A .在不同的函数中可以使用相同名字的变量
B .函数中的形式参数是在栈中保存
C .在一个函数内定义的变量只在本函数范围内有效
D .在一个函数内复合语句中定义的变量在本函数范围内有效(复合语句指函数中的成对括号构成的代码)
题解:选择D。
- 选项A是正确的。不同的函数就相当于不同的作用域,为独立的空间,使用相同名字变量不受影响。
- 选项B是正确的。函数中的形参相当于该函数作用域内的局部变量,局部变量是放在栈区保存的。
- 选项C是正确的。函数内定义的变量为该函数内的局部变量,当出了该函数,会自动销毁。
- 选项D是错误的。函数内中复合语句中定义的变量只在该复合语句内有效,因为在复合语句内定义的变量,相当于该复合语句内的局部变量,局部变量的作用域为局部范围。具体如下列代码:
//函数内复合语句定义的变量只在复合语句内有效
void fun()
{{int a = 10;}printf("%d\n", a);
}
int main()
{fun();return 0;
}
题目四:
以下关于函数设计不正确的说法是:( )
A .函数设计应该追求高内聚低耦合
B .要尽可能多的使用全局变量
C .函数参数不易过多
D .设计函数时,尽量做到谁申请的资源就由谁来释放
高内聚,低耦合的概念:
- 耦合:每个模块之间相互联系的紧密程度,模块之间联系越紧密,则耦合性越高,模块的独立性就越差!反之同理
- 内聚:一个模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的联系程度越高,则内聚性越高,即”高内聚“。
题解:选择B。
- 选项A是正确的。函数设计的目的就是独立封装功能模块,其它模块出差不会影响该模块,并且模块内各个元素之间的联系紧密,更易于代码的维护。
- 选项B的错因。函数应该遵循谁创建谁销毁,简单来说就是使用完该函数,函数内的元素应该随着函数进行销毁,如果在函数内尽可能多的全局变量,会造成数据混乱,全局变量的值不够明确。全局变量每个方法都可以访问,很难保证数据的正确性和安全性
- 选项C是正确的。参数越少越好,否则用户在使用时体验不是很好,还得必须将所有参数完全搞明白才可以使用,并且容混淆。
- 选项D是正确的。谁申请的谁维护谁释放,否则如果交给外部使用者释放,外部使用者可能不知道或者忘记,就会造成资源泄漏。
题目五:
函数调用exec((vl,v2),(v3,v4),v5,v6);中,实参的个数是:( )
A .3
B .4
C .5
D .6
题解:选择B。
- 函数的实参可以是变量、常量、表达式、函数等等
- 本题实参中有两个逗号表达式,逗号表达式的原则为从左到右计算,整个逗号表达式的值为最后一个元素。
题目六:
关于实参和形参描述错误的是:( )
A .形参是实参的一份临时拷贝
B .形参是在函数调用的时候才实例化,才开辟内存空间
C .改变形参就是改变实参
D .函数调用如果采用传值调用,改变形参不影响实参
题解:选择C。
- 选项A是正确的。实参为调用该函数时的程序真实数据,而在调用函数时,系统会自动给该函数创建与实参同类型的临时变量,该变量称为形参,并且形参有自己的内存空间。
- 选项B是正确的。在函数调用时,会对形参进行实例化,开辟内存空间。
- 选项C的错因。函数的传参有两种,分别为传值和传址,当进行传值时,形参的改变不会影响实参,当进行传址时,形参的内容存储的是实参的内存地址,指向实参,访问实参地址时,修改数据会影响实参的值,但如果单纯修改形参的内容,即存储的地址,改为其它内存地址,这是不会影响实参的,这种还是相当于传值。
- 选项D是正确的。函数传参分为传值和传址,传值不会影响实参。
题目七:
能把函数处理结果的2个数据返回给主调函数,在下面的方法中不正确的是:( )
A .return 这2个数
B .形参用数组
C .形参用2个指针
D .用2个全局变量
题解:选择A。
- 选项A的错因。return语句只能返回1个值。
- 选项B是正确的。形参为数组时,其实接收的是实参传递过来的数组首元素地址,通过数组首元素地址,可以找到数组内的元素,进行修改,也就相当于将处理好的数据返回给了主调函数。
- 选项C是正确的。形参用指针来接收主调函数传过来的值,实参传递的地址,属于传址,有了实参数据的地址,就可以访问实参,对数据进行修改。
- 选项D是正确的。全局变量的作用域为整个工程,那就是说在函数中赋值新的数据时,全局变量的值也在修改,主调函数使用全局变量值时,可以接收到修改值。
题目八:
关于函数调用说法不正确的是:( )
A .函数可以传值调用,传值调用的时候形参是实参的一份临时拷贝
B .函数可以传址调用,传址调用的时候,可以通过形参操作实参
C .函数可以嵌套定义,但是不能嵌套调用
D .函数可以嵌套调用,但是不能嵌套定义
题解:选择C。
- 选项A是正确的。函数进行传值调用,形参是实参的一份临时拷贝。
- 选项B是正确的,函数进行传址调用时,形参指向了实参,可以通过形参操作实参。
- 选项C的错因。函数不可以嵌套定义,可以嵌套调用。
- 选项D是正确的。函数可以嵌套调用,不可以嵌套定义。
题目九:
在函数调用时,以下说法正确的是:( )
A .函数调用后必须带回返回值
B .实际参数和形式参数可以同名
C .函数间的数据传递不可以使用全局变量
D .主调函数和被调函数总是在同一个文件里
题解:选择B。
- 选项A的错因。函数可以为无返回类型函数,也就是说可以没有返回值。
- 选项B是正确的。实参与形参均会开辟空间,互不影响,并且形参的作用域为函数内部,因此实参与形参是可以同名的。
- 选项C的错因。函数间的数据传递可以使用全局变量,因为全局变量是公共的,作用域为整个工程,谁都可以使用。
- 选项D的错因。C语言具有模块化开发特性,通常将函数的声明方式在.h头文件中,特意创建一个.c文件用来存放函数的定义(实现),最后在主调函数中包含.h头文件,调用函数定义。
题目十:
关于函数的声明和定义说法正确的是:( )
A .函数的定义必须放在函数的使用之前
B .函数必须保证先声明后使用
C .函数定义在使用之后,也可以不声明
D .函数的声明就是说明函数是怎么实现的
题解:选择B。
- 选项A的错因。函数的使用有两种情况,情况一为函数已声明,情况二为函数没有声明但函数定义在函数使用之前,因此选项A是片面的,当函数已进行声明,函数的定义就可以不放在函数使用之前。
- 选项B是正确的。C语言规定,函数必须保证先声明(定义)后使用。
- 选项C的错因。函数定义在使用之后的前提是函数已声明。
- 选项D的错因。函数的声明是告诉编译器,有一个有着返回类型 函数名(参数类型);的函数,而说明函数是怎么实现的是函数的定义(实现)。
题目十一:
根据下面递归函数:调用函数Fun(2),返回值是多少( )
A .2
B .4
C .8
D .16
int Fun(int n)
{ if(n==5) return 2; else return 2*Fun(n+1);
}
题解:选择D。
- 对于递归的题目,最好的解决方式是画图
- 请看图解:
题目十二:
关于递归的描述错误的是:( )
A .存在限制条件,当满足这个限制条件的时候,递归便不再继续
B .每次递归调用之后越来越接近这个限制条件
C .递归可以无限递归下去
D .递归层次太深,会出现栈溢出现象
题解:选择C。
- 选项A是正确的。函数递归存在限制条件,如果不存在限制条件,函数将无限递归,反复调用创建函数,直到程序崩溃,这也是函数递归必须遵循的条件之一。
- 选项B是正确的。函数递归中,每次递归要越来越接近限制条件,直到递归不再继续,如果不接近限制条件,会导致无限递归,直到程序崩溃,这也是函数递归必须遵循的条件之一。
- 选项C的错因。递归不可以无限递归下去,函数是存放在栈区的,当进行递归时,每创建一个函数就会从栈顶进入,栈区也是有上限的,当无限递归,栈区存放不下时,就会导致栈溢出情况。
- 选项D是正确的。递归层次太深时,声明需要调用多次函数,那就会多个函数入栈,这样栈区存储不下时,就会导致栈溢出。