1、函数调用exec((v1,v2),(v3,v4,v5),v6,v7)中,实参的个数是4个。
解析:逗号运算符(百度百科):在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。
所以exec((v1,v2), (v3,v4,v5),v6,v7)相当于exec(v2, v5,v6,v7)。
声明定义函数的时候,exec((v1,v2), (v3,v4,v5),v6,v7)括号内的参数叫做“形式参数”,不是实际的参数变量,是用来接收传递的参数的。而实际调用函数的时候,括号内应该填上对应类型的参数,也就是传递实际参数到函数内,这些参数就是“实参”。
题目问的是“调用”函数时,“实参”的数量,也就是4啦。
2、C语言程序中必须有的函数式main函数。main函数作为函数的入口必须存在。
3、在共有派生的情况下,派生类中定义的成员函数只能访问原基类的共有成员和保护成员。
解析:使用 private 继承 , 父类的所有方法在子类中变为 private;
使用 protected 继承 , 父类的 protected 和 public 方法在子类中变为 protected,private 方法不变 ;
使用 public 继承 , 父类中的方法属性不发生改变 。
4、有以下结构体说明进入变量的定义,且指针p指向变量a,指针q指向变量b。则不能把结点b连接到结点a之后的语句是p.next=&b;
struct node
{
char data;
struct node *next;
}a,b,*p=&a,*q=&b;
解析:p是一指向结构体类型的指针变量,其初始值是让其指向结构体变量a,要通过指针变量p来引用结构体变量的成员next,通常可使用两种形式:p->next 或(*p).next,而p.next是非法的引用。
5、下面代码的运行结果
int a[]={1,2,3,4};
int *b=a;
*b+=2;
*(b+2)=2;
b++;
printf("%d,%d\n",*b,*(b+2));
解析:输出2,4
数组名a作为右值时代表数组元素的首地址也就是&a[0],* b=a,此时b指向了第一个元素也就是1,然后 * b+=2,也就是1+2=3,此时数组第一个元素变成了3.* (b+2)相当于a[2]也就是a[2]=2,此时数组第三个元素变成了2. b++也就是b=b+1,此时b已经指向了数组的第二个元素也就是2.因此 * (b+2)也就是变成了数组的第四个元素也就是4。
6、下面程序的输出是什么
int main(void)
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
return 0;
解析:输出2 5
&a就是数组的地址,&a+1相当于加一个数组,即偏移一个数组。
注意理解两个步长。 * (a+1)中的1为元素, (ptr-1)中的1为数组。 (a+1)就是a[1],输出为2,指针+1所得的结果要根据指针类型加上一定的值,不同类型的指针+1之后增加的大笑不停,a的长度为5的int数组指针,所以要加5 * sizeof(int),所以第四行语句执行后,ptr指向a[5],最后输出时,即*(ptr-1)时,ptr为int型指针,则-1操作减少sizeof(int * )指向a[4],输出为5.
7、通过指针调用基类虚函数时,C++系统对该调用采用动态联编。
静态联编 :指在编译阶段就将函数实现和函数调用关联起来,也叫早绑定。
动态联编:在程序执行的时候才将函数实现和函数调用关联。因此也叫晚绑定,一般情况下都是静态联编,涉及到多态和虚拟函数就必须使用动态联编了。
8、对于基类相同的两个指针变量之间,不能进行的运算是+。
C语言中,对于基类型相同的两个指针变量之间可以进行大小比较、赋值及减法运算,但加法运算没有意义。
9、有函数定义:
void test(int a){}
void test (float a){}
则以下调用错误的是(D)
A test(1)
B test(‘c’)
C test(2+‘d’)
D test (0.5)
解析:编译器会提示参数不匹配,但是不匹配的原因是:类型转换只能从下往上自动转换,而不能自动从上往下转换。
0.5默认是double类型,既不能转换成float类型,也不能转换成int类型。故会提示参数不匹配。
10、关于“深拷贝”,下列说法正确的是(A)
A 会拷贝动态分配的成员对象
B 会拷贝成员数据的值
C 会拷贝静态分配的成员对象
D B和C都对
解析:深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。
浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。
B和C都算错在了一个地方,没有考虑静态成员。类的静态成员是所有类的实例共有的,存储在全局(静态)区,只此一份,不管继承、实例化还是拷贝都是一份。
B中,静态成员属于成员数据,而C中,静态成员和局部成员都是静态分配的(与动态分配对应),因此B和C中都包含了静态成员,所以不正确。
因此,D也不正确。