1.参加位运算的数据可以是任何类型的数据。请问这句话的说法是正确的吗?
答案:错误
位运算符主要用于整型数据(如int
、unsigned int
、long
、unsigned long
等)和字符型数据(如char
和unsigned char
),因为这些类型的数据在内存中以二进制形式直接存储,位运算符可以直接对它们的二进制位进行操作。
如果尝试对非整型数据(如浮点数、字符串或对象等)使用位运算符,将会导致编译错误。他们的内部表示与整形不同。
2.一个全局变量tally,两个线程并发执行(代码段都是ThreadProc),问两个线程都结束后,tally取值范围为_______
1 2 3 4 5 |
|
A[50,100]
B[100.100]
C[1275,2550]
D[2550,2550]
答案:A
在两个线程并发的过程中,a线程对tally加1后,还没有更新tally在内存中的值,线程b读取tally值,执行加1,更新tally为1,然后a线程重新读取tally值,这样交替运行,最终为50 最大值的情况: a线程对tally加到50后,更新tally在内存中的值为50,然后线程b读取tally值,再执行加50运算,结果为100;
如果对total+=1加上互斥锁,才会固定为100。
3.下面函数的输出结果是()
1 2 3 4 |
|
A0
B-1
C-2
D1
答案: C
首先0000 0000 0000 0000 0000 0000 0000 0001左移31位得
1000 0000 0000 0000 0000 0000 0000 0000 (-2147483648)
与1异或 得1111 1111 1111 1111 1111 1111 1111 1110
补码转原码,-1并将除符号位的位取反 1000 0000 0000 0000 0000 0000 0000 0010(-2)
4.下列程序的运行结果是0.请为横线处选择合适的程序()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
Avoid (Base::*q)(Base,Base)
Bvoid *q(Base,Base)
Cvoid *q()
Dvoid (*q)(Base,Base)
答案 D 静态成员函数不用加作用域非静态成员函数要加作用域
5. 下列关于运算符重载的叙述中,正确的是( )
A通过运算符重载,可以定义新的运算符
B有的运算符只能作为成员函数重载
C若重载运算符+,则相应的运算符函数名是+
D重载二元运算符时,必须声明两个形参
答案 B
一般情况下,单目运算符最好重载为类的成员函数,双目运算符最好重载为类的友元函数。
关于选项 A,通过运算符重载不能创建全新的运算符符号,而只能改变已有的运算符的行为。
关于选项 B,有些运算符可以作为成员函数进行重载,而有些则不能。具体要根据运算符的性质和所需的操作数类型来决定。
关于选项 C,重载运算符时,相应的运算符函数名并不一定与运算符本身的符号相同,而是通过运算符函数的命名来定义。
关于选项 D,如果用成员函数重载,只写一个参数的话,默认就是调用者为第一个参数。
作者:陈让然
链接:牛客网公司真题_免费模拟题库_企业面试|笔试真题
来源:牛客网
6.以下说法不正确的是?
A类成员的定义必须放在类定义体内部
B类的一个成员只能具有一种访问控制属性
C在类中,不作特别说明的数据成员均为私有类型
D构造函数和析构函数是特殊的成员函数,因此不允许重载
E类成员的定义必须是成员变量在前、成员函数在后
答案 :ADE
A:类成员的声明要放在类定义体内部,而定义可以在外部
D: 构造函数可以重载,析构函数不可以
E: 没有顺序要求
7 阅读C语言代码输出()
1 2 3 4 5 6 7 8 |
|
A3 3
B2 2
C2 3
D3 2
答案: A
prinf从右到左编译,从左到右输出,*p已经是++p之后的了