概述
一、下面代码的输出结果是()
1
2
3
4
5
6
7
8
9
10
11
12
|
int
main(){
int
pid;
int
num=1;
pid=fork();
if
(pid>0){
num++;
printf
(
"in parent:num:%d addr:%xn"
,num,&num);
}
else
if
(pid==0){
printf
(
"in child:num:%d addr:%xn"
,num,&num);
}
}
|
虚拟地址空间。num地址的值相同,但是其真实的物理地址却不一样。
linux下实现了一下,发现地址值真的一样。
fork之后子进程复制了父进程的数据、堆栈。
但是由于地址重定位器之类的魔法存在,
所以,看似一样的地址空间(虚拟地址空间),
其实却是不同的物理地址空间。
同时可以验证c程序中输出的地址空间其实都是虚拟地址空间。
父子进程中输出的num不同,num地址相同
二、
不考虑任何编译器优化(如:NRVO),下述代码的第10行会发生
1
2
3
4
5
6
7
8
9
10
11
|
#include <stdio.h>//1
class
B
//2
{
//3
};
//4
B func(
const
B& rhs){
//5
return
rhs;
//6
}
//7
int
main(
int
argc,
char
**argv){
//8
B b1,b2;
//9
b2=func(b1);
//10
}
//11
|
一次拷贝构造函数,一次析构函数,一次(拷贝赋值运算符)operator=
b2=func(b1);//10
一次拷贝构造函数发生在func函数调用完成,返回B类型的对象时,因为返回的不是引用类型,所以会生成一个对象,
不妨称为TEMP,将返回的对象通过拷贝构造函数复制给TEMP,然后,返回值所对应的对象会被析构。如果返回值是引用类型,
则不会调用拷贝构造函数。
赋值运算符在func函数执行完成后,将上面提到的TEMP,通过赋值运算符赋值给b2,值得注意的是赋值运算符重载函数如果不自己定义,
程序会认为是调用缺省的赋值运算符重载函数。
三、
以下代码段有问题的是()
正确答案: A B C
void func1(char *e){ char *p1; p1=malloc(100); sprintf(p1,error:"%s'.",e); local_log(p1); }
int func2(char *filename) { FILE *fp; int key; fp=fopen(filename,"r"); fscanf(fp,"%d",&key); return key; }
void func3(char *info){ char *p,*pp; p=malloc(100); pp=p; free(p); sprintf(pp,*info:"%s'.",info); free(pp); }
选项全部都正确
四、
InvalidateRect(NUll,FALSE)使整个客户区重绘,不擦除背景。
#include<stdio.h>
int
main()
{
unsigned
char
i=7;
int
j=0;
for
(;i>0;i-=3)
{
++j;
}
printf
(
"%dn"
,j);
return
0;
}
|
请问该程序的输出是多少?
unsigned char 8位数据位,范围
0-255,
所以-2(11111110)时,溢出变成254;
同理-1(11111111)时,溢出变成255;
最后减到0时,不满足循环条件,for停止。
刚好173次。
7 4 1 ==> 共 (7-1)/3+1=3次(1-3=-2,即254, 继续循环)
254 251 ... 5 2 ==> 共 (254-2)/3+1=85次(2-3=-1,即255, 继续循环)
255 252 ... 6 3 ==> 共 (255-5)/3+1=85次(3-3=0, 退出循环)
所以总共173次。
所以-2(11111110)时,溢出变成254;
同理-1(11111111)时,溢出变成255;
最后减到0时,不满足循环条件,for停止。
刚好173次。
7 4 1 ==> 共 (7-1)/3+1=3次(1-3=-2,即254, 继续循环)
254 251 ... 5 2 ==> 共 (254-2)/3+1=85次(2-3=-1,即255, 继续循环)
255 252 ... 6 3 ==> 共 (255-5)/3+1=85次(3-3=0, 退出循环)
所以总共173次。
这题正着推不容易,可以考虑反着推
要想退出循环 最后必定是 i=0
根据选项
A: (0 + 2*3) % 256 = 6 不是7 , 所以A错误
C: (0 + 173*3) % 256 = 7 , 所以C可以
D: (0 + 172*3) % 256 = 4 不是7,所以D错误
B: 既然C可以,当然B就错误
五、
假设MySQL数据库表:
create table T{k int unsigned not null auto_increment,a date,b varchar(24),c int,d varchar(24),primary key(k),unique key a_index (a DESC,b DESC),key k1(b),key k2(c),key k3(d));
如下哪些sql语句查询能较好的利用索引?()
正确答案: A D
select b from WHERE b like 'aaa%';
select a,b from T WHERE a='2015-10-25' ORDER BY b ASC,c ASC;
select a,b,c from T WHERE a='2015-10-25' ORDER BY b ASC;
select a,b,c from T WHERE a='2015-10-25' ORDER BY a,b;
解析如下:
一、什么是索引:
简单的来说,建立索引在进行数据库操作的时候不需要全盘一条条的扫描,删选出符合的记录,索引内部自己有一套优化算法,因此借助索引来对数据库进行操作可以提高查询的效率。
二、什么时候建立的索引将失效或效率不高(情况有很多,这里列举常见的几种, 假设在字段name上建立了索引):
1、使用了运算符!=,以及关键字not in, not exist等,认为产生的结果集很大,往往导致引擎不走索引而是走全盘扫描
2、对索引字段使用了函数,如where substr(name, 1, 3)=‘mark’, 导致索引无效
3、使用like和通配符,第一个字符是%将导致索引失效,如where name like "%ark“ (A正确)
.....
三、order by与索引
首先利用where进行数据查询,这一步是免不了的,至于这一步有没有利用索引暂时不考虑,关键是在获取所有符合的记录后还需要进行排序,看看order by是如何利用索引的。
如果order by中的字段有建立索引,同时:
1、该字段没有出现在where中,则在排序的时候需要正常排序,默认order by是升序排序, 故索引没有对排序产生有利帮助 (B,C错误)
2、该字段同时同时出现在where中,则在获取记录后不进行排序,而是直接利用索引, 效率变高。(D正确)
补充: group by也和order by类似
六、
InvalidateRect(NULL,TRUE)使整个客户区重绘,而且擦除背景。
InvalidateRect(NUll,FALSE)使整个客户区重绘,不擦除背景。
七、
windows编程首先要包含Windows.h头文件
创建窗口大致需要以下几个步骤:
1.建立窗口类,WNDCLASS
2.注册窗口类,RegisterClass
3.创建窗口,CreateWindow
4.显示更新窗口,ShowWindow,UpdateWindow
5.消息循环
6.窗口过程
至于ShowWindow之后为什么还要调用UpdateWindow呢,是因为ShowWindow只负责将窗口以什么各样的方式显示,而UpdateWindow负责发送WM_PAINT消息,将窗口重绘。而不调用UpdateWndow则系统要等消息队列遍历完成之后重绘。同样会显示窗口,只是UpdateWindow会让WM_PAINT立刻被处理发生重绘操作,效率要高一些。
最后
以上就是长情野狼为你收集整理的笔试选择题二十六 正确答案: A B C 正确答案: A D 的全部内容,希望文章能够帮你解决笔试选择题二十六 正确答案: A B C 正确答案: A D 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复