71-80

注:以下问题的部分解析并非全部是自己原创,只是为了便于以后复习,直接粘贴总结的答案,主要来源是七月在线中的解析部分。https://www.julyedu.com/question/selectAnalyze/kp_id/4/cate/C

1、请问最终输出的count值为( )

int main(void)
{
int count = 0;
int m = 779;
while (m)
{
count++;
m = m&(m - 1);
}
printf("%d\n", count);
return 0;
}
A 3
B 4
C 5
D 6

解释:选C

上述代码实际上是在统计变量m二进制形式中1的个数。
m=779,其对应的二进制为:1100001011,m&(m-1)相当于将m二进制中低位的1换成0,共5次。

2、在32位操作系统中,我们定义如下变量

int (*n)[10];
请问调用函数sizeof(n),返回值为( )
A 4
B 40
C 8
D 80

解释:选A

n为一个指向含有10个元素数组的指针,即数组指针,在32位操作系统中,指针的大小为4。

3、 请问最终输出的i值为( )

int main(void)
{
int i = 1;
int j = i++;
if ((i++ > ++j) && (++i == j))
{
i += j;
}
printf("%d\n", i);
return 0;
}
A 2
B 3
C 4
D 5

解释:选B
		j = i++            ==>        j = 1, i = 2;
		i++ > ++j          ==>        i = 2, j = 2, 2 > 2(假),i = 3
		与操作只有当前一部分为真时,后一部分才执行,故(++i ==j)不执行
		i = 3。

4、 以下关于C++语言叙述正确的是( )

A 可以在一个函数中定义另一个函数
B main()函数必须放在其他函数之前
C 构成C++语言程序的基本单位是函数
D 所有被调用的函数一定要在调用之前进行定义

解释:选C

A选项错误。C++中不允许对函数作嵌套定义,即在一个函数中不能定义另一个函数;
B选项错误。main()函数是一个特殊函数,不管把它放在代码的什么位置,每个C++程序的运行都是从main()函数开始。
D选项错误。在C++中,为了使函数的调用不受函数定义位置的影响,可以在调用函数前进行函数的声明,这样就可以保证函数调用的合法性。

5、两个线程并发执行以下代码,假设a是全局变量,初始值为5,那么以下输出中( )是不可能的。

void foo( )
{
a = a + 1;
printf("%d_", a);
}
A 6_6_
B 7_7_
C 5_6_
D 6_7_

解释:选C

需要注意的是,打印操作printf是原子操作,不会被中断。设两个线程分别为t1和t2。若t1, t2顺序执行,则出现选项D的结果。若t1, t2先依次执行a = a + 1,最后再执行打印操作,则出现选项B的结果。若t1执行a = a + 1后没有写回内存,此时t2执行a = a + 1写回内存并打印输出,然后t1执行写回内存操作,最后再打印,则出现选项A的结果。
另:原子操作是不可分割的,在执行完毕之前不会被任何其它任务或事件中断。

6、执行以下代码,不可能的输出结果是( )

void main( )
{
pid_t pid;
pid=fork( );
if (pid < 0)
printf(“-1”);
else if (pid == 0)
printf(“0”);
else
printf(“1”);
}
A 0
B -1
C 01
D 10

解释:选A

fork()函数是计算机程序设计中的分叉函数,fork函数将运行着的程序分成2个几乎完全一样的进程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本(是副本所以内存不共享)。其返回值为: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记;否则,出错返回-1。
若fork()函数执行成功时,当前进程P会创建一个新进程p1。P叫做父进程,p1叫做子进程。fork()函数的特点是调用一次,返回两次。一次是在父进程P中,返回值是子进程p1的ID;另一次是子进程p1中,返回值为0。父进程P和子进程p1继续并发执行。
若fork()函数出现错误,则返回一个负值。因此,当fork()函数出现错误时,pid为负值,选项B可能出现。当fork()函数成功执行时,父进程P与子进程p1并发执行,会出现选项C和选项D的结果。

7、假定一个二维数组的定义语句为“int a[3][4]={ {3,4},{2,8,6} };”,则元素a[1][2]的值为( )

A 2
B 4
C 6
D 8

解释:选C

8、 下面函数的功能是( )

int fun(char *s)
{
char *p=s;
while (*p++);
return p-s-1;
}
A 求字符串的长度
B 复制一个字符串
C 计算字符串的位(bit)数
D 求字符串存放的位置

解释:选A

*p++相当于 * p,p++,与(*p)++不同。
由于后置++运算符,p指向’\0’的下一个字符。

9、 在16位机器上跑下列foo函数的结果是( )

void foo( )
{
int i = 65536;
cout << i <<”,”;
i = 65535;
cout << i;
}
A -1,65535
B 0,65535
C -1,-1
D 0,-1

解释:选D

在16位机器上,int类型占16位,其中,首位为符号位,对于65536由于其共17位,截取其低位的16位,全为0,故首先输出0,对于65535,其存储为16位1,首位为符号位,表示是负数,负数在机器中以补码的形式存储,按位取反再加一,可得-1。

10、 有一段年代久远的C++代码,内部逻辑负责。现在需要利用其实现一个新的需求,假定有以下可行的方案,应当优先选择( )

A 修改老代码的接口,满足新的需求
B 在这段代码之外写一段代码,调用该代码的一些模块,完成新功能需求
C 修改老代码的内部逻辑,满足新的需求
D 将老代码抛弃,自己重新实现类似的逻辑

解释:选B

考虑到代码重用性和效率问题,全部重新写显然不满足要求。由于代码时间年代较久,对其实现的理解欠佳,故直接改写原代码容易造成代码出现意想不到的问题。利用C++中封装的思想,调用原代码的一些模块来实现新的功能来满足需求,这样不但提高了代码的重用性、降低了出错率也提高了开发效率,是应该选择的方案。

发布了31 篇原创文章 · 获赞 4 · 访问量 2451

猜你喜欢

转载自blog.csdn.net/weixin_44412429/article/details/95303102