1. 若有定义语句:char s[3][10],(*k)[3],*p;则以下赋值语句错误的是
1.p = s;
2.p = k;
3.p = s[0];
4.k = s;
答案:124
char s[3][10] s 是数组指针,类型为char (*)[3],所指向的每个数组长度为10;
char (*k)[3] k是一个数组指针,类型也为 char (*)[3],但是所指向的每个数组的长度未知;
char *p p是一个char*类型的指针
在没有强制类型转换的情况下,只有类型完全相同的指针才能相互复制。所以124是无法赋值的
s[0]是第一行数组的首元素地址,s[0]与s[0][0]相等,可以给char*类型的指针赋值。
2.函数即可以嵌套定义,又可以嵌套调用。请问这句话的说法是正确的吗?
错误,函数不可以嵌套定义,但可以嵌套调用
不过lambda表达式可以嵌套定义
3. 什么函数不能声明为虚函数?
A静态成员函数
B内联函数
C构造函数
D析构函数
答案:ABC
B 内联函数目的是在代码中直接展开(编译期),而虚函数是为了继承后能动态绑定执行自己的动作(动态绑定),因此本质是矛盾的,因此即使内联函数声明为虚函数,编译器遇到这种情况是不会进行inline展开的,而是当作普通函数来处理。因此声明了虚函数不能实现内敛的,即内敛函数可以声明为虚函数,但是毫无了内联的意义
作者:乖,让我摸摸头
链接:牛客网公司真题_免费模拟题库_企业面试|笔试真题
来源:牛客网
C 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数
作者:v_xchen_v
链接:牛客网公司真题_免费模拟题库_企业面试|笔试真题
来源:牛客网
4.
|
32位系统下下面程序的输出结果为多少?
答案: 6544
数组在函数的参数中会退化成指针,再求长度就是4字节
5. 若变量已正确定义,要求程序段完成求5!的计算,不能完成此操作的程序段是()
Afor(i=1,p=1;i<=5;i++) p*=i;
Bfor(i=1;i<=5;i++){ p=1; p*=i;}
Ci=1;p=1;while(i<=5){p*=i; i++;}
Di=1;p=1;do{p*=i; i++; }while(i<=5);
答案:B
在循环中每次p都被设置成1,最后得到的是5
6 类B是类A的公有派生类,类A和类B中都定义了虚函数func(),p是一个指向类A对象的指针,则p->A::func()将()?
A调用类B中函数func()
B即调用类A中函数,也调用类B中的函数
C调用类A中函数func()
D根据p所指的对象类型而确定调用类A中或类B中的函数func()
答案:C 加了作用域就是A中的函数
父类指针如果指向的是子类对象,那么调用虚函数就是子类的虚函数,因为虚函数表上父类的虚函数被覆盖了。如果指向父类对象,调用虚函数将会调用父类的虚函数。
7 并发编程中通常会遇到三个问题:原子性问题,可见性问题,有序性问题, java/C/C++中volatile关键字可以保证并发编程中的()
A原子性, 可见性
B可见性,有序性
C原子性,有序性
D原子性, 可见性,有序性
答案:B
- 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。(实现可见性)
- 禁止进行指令重排序。(实现有序性)
- volatile 只能保证对单次读/写的原子性。i++ 这种操作不能保证原子性。
作者:羽杰
链接:https://www.jianshu.com/p/ccfe24b63d87
来源:简书
8 对于代码段
1 2 |
|
下面描述正确的是()
A其中循环控制表达式与0等价
B其中循环控制表达式与’0’等价
C其中循环控制表达式是不合法的
D以上说法都不对
答案B printf(“*”)返回的是字符的个数,为1(真)
scanf和printf都是有返回值的
scanf:返回值为参数的个数,输入不规范返回的是0,ctrl+z返回EOF
printf:返回输出的字符的个数
9 下列程序执行后的输出结果是 __________
1 2 3 4 5 6 7 8 9 10 11 12 |
|
A6
B7
C8
D9
答案 A 0+6,与b[0]原本的值无关
10
设有如下定义:
1 2 3 4 5 6 |
|
下面各输入语句中错误的是____________
Ascanf("%d", &(*p).age);
Bscanf("%s", &std.name);
Cscanf("%c", &std[0].sex);
Dscanf("%c", &(p->sex));
答案 B 因为std.name是一个数组,而%s应该直接用于数组名,不需要再取地址。正确的写法应该是scanf("%s", &std[0].name);