c笔试题库之编程问答题 150200道.docx
- 文档编号:11590978
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:30
- 大小:24.29KB
c笔试题库之编程问答题 150200道.docx
《c笔试题库之编程问答题 150200道.docx》由会员分享,可在线阅读,更多相关《c笔试题库之编程问答题 150200道.docx(30页珍藏版)》请在冰豆网上搜索。
c笔试题库之编程问答题150200道
C++笔试题库之编程、问答题150~200道
151、写出判断ABCD四个表达式的是否正确,若正确,写出经过表达式中a的值
inta=4;
(A)a+=(a++);(B)a+=(++a);(C)(a++)+=a;(D)(++a)+=(a++);
a=?
答:
C错误,左侧不是一个有效变量,不能赋值,可改为(++a)+=a;
改后答案依次为9,10,10,11
152、某32位系统下,C++程序,请计算sizeof的值
charstr[]=“
char*p=str;
intn=10;
请计算
(1)sizeof(str)=?
(2)sizeof(p)=?
(3)sizeof(n)=?
voidFoo(charstr[100]){
请计算
sizeof(str)=?
(4)
}
void*p=malloc(100);
请计算
sizeof(p)=?
(5)
答:
(1)25
(2)4(3)4(4)4(5)4
153、回答下面的问题
(1).VoidGetMemory(char**p,intnum){
*p=(char*)malloc(num);
}
voidTest(void){
char*str=NULL;
GetMemory(&str,100);
strcpy(str,“hello”);
printf(str);
}
请问运行Test函数会有什么样的结果?
答:
输出“hello”
154、voidTest(void)
{
char*str=(char*)malloc(100);
strcpy(str,“hello”);
free(str);
if(str!
=NULL){
strcpy(str,“world”);
printf(str);
}
}
请问运行Test函数会有什么样的结果?
答:
输出“world”
155、char*GetMemory(void){
charp[]=“helloworld”;
returnp;
}
voidTest(void){
char*str=NULL;
str=GetMemory();
printf(str);
}
请问运行Test函数会有什么样的结果?
答:
无效的指针,输出不确定
156、编写strcat函数
已知strcat函数的原型是char*strcat(char*strDest,constchar*strSrc);
其中strDest是目的字符串,strSrc是源字符串。
(1)不调用C++/C的字符串库函数,请编写函数strcat
答:
VC源码:
char*__cdeclstrcat(char*dst,constchar*src)
{
char*cp=dst;
while(*cp)
cp++;
while(*cp++=*src++);
return(dst);
}
157、strcat能把strSrc的内容连接到strDest,为什么还要char*类型的返回值?
答:
方便赋值给其他变量
158、MFC中CString是类型安全类么?
答:
不是,其它数据类型转换到CString可以使用CString的成员函数Format来转换
159.C++中什么数据分配在栈或堆中?
答:
栈:
存放局部变量,函数调用参数,函数返回值,函数返回地址。
由系统管理
堆:
程序运行时动态申请,new和malloc申请的内存就在堆上
160、函数模板与类模板有什么区别?
答:
函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化
必须由程序员在程序中显式地指定。
161、inti=10,j=10,k=3;k*=i+j;k最后的值是?
答:
60,此题考察优先级,实际写成:
k*=(i+j);,赋值运算符优先级最低
162、do……while和while……do有什么区别?
答、前一个循环一遍再判断,后一个判断以后再循环
163、请写出下列代码的输出内容
#include
main()
{
inta,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf(“b,c,d:
%d,%d,%d”,b,c,d);
return0;
}
答、10,12,120
164.在c语言库函数中将一个字符转换成整型的函数是atol()吗,这个函数的原型是什么?
答、函数名:
atol
功能:
把字符串转换成长整型数
用法:
longatol(constchar*nptr);
程序例:
#include
#include
intmain(void)
{
longl;
char*str=“98765432″;
l=atol(lstr);
printf(“string=%sinteger=%ld\n”,str,l);
return(0);
}
165.以下三条输出语句分别输出什么?
charstr1[]=“abc”;
charstr2[]=“abc”;
constcharstr3[]=“abc”;
constcharstr4[]=“abc”;
constchar*str5=“abc”;
constchar*str6=“abc”;
cout<<boolalpha<<(str1==str2)<<endl;//输出什么?
cout<<boolalpha<<(str3==str4)<<endl;//输出什么?
cout<<boolalpha<<(str5==str6)<<endl;//输出什么?
答:
分别输出false,false,true。
str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。
str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。
166以下代码中的两个sizeof用法有问题吗?
voidUpperCase(charstr[])//将str中的小写字母转换成大写字母
{
for(size_ti=0;i<sizeof(str)/sizeof(str[0]);++i)
if(‘a’<=str[i]&&str[i]<=’z’)
str[i]-=(‘a’-'A’);
}
charstr[]=“aBcDe”;
cout<<“str字符长度为:
”<<sizeof(str)/sizeof(str[0])<<endl;
UpperCase(str);
cout<<str<<endl;
答:
函数内的sizeof有问题。
根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。
函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。
167非C++内建型别A和B,在哪几种情况下B能隐式转化为A?
答:
a.classB:
publicA{……}//B公有继承自A,可以是间接继承的
b.classB{operatorA();}//B实现了隐式转化为A的转化
c.classA{A(constB&);}//A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数
d.A&operator=(constA&);//赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个
168.以下代码有什么问题?
structTest
{
Test(int){}
Test(){}
voidfun(){}
};
voidmain(void)
{
Testa
(1);
a.fun();
Testb();
b.fun();
}
答:
变量b定义出错。
按默认构造函数定义对象,不需要加括号。
169以下代码有什么问题?
cout<<(true?
1:
”1″)<<endl;
答:
三元表达式“?
:
”问号后面的两个操作数必须为同一类型。
170以下代码能够编译通过吗,为什么?
unsignedintconstsize1=2;
charstr1[size1];
unsignedinttemp=0;
cin>>temp;
unsignedintconstsize2=temp;
charstr2[size2];
答:
str2定义出错,size2非编译器期间常量,而数组定义要求长度必须为编译期常量。
171.以下代码中的输出语句输出0吗,为什么?
structCLS
{
intm_i;
CLS(inti):
m_i(i){}
CLS()
{
CLS(0);
}
};
CLSobj;
cout<<obj.m_i<<endl;
答:
不能。
在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而不会执行其后的初始化表达式。
只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。
172C++中的空类,默认产生哪些类成员函数?
答:
classEmpty
{
public:
Empty();//缺省构造函数
Empty(constEmpty&);//拷贝构造函数
~Empty();//析构函数
Empty&operator=(constEmpty&);//赋值运算符
Empty*operator&();//取址运算符
constEmpty*operator&()const;//取址运算符const
};
173以下两条输出语句分别输出什么?
floata=1.0f;
cout<<(int)a<<endl;
cout<<(int&)a<<endl;
cout<<boolalpha<<((int)a==(int&)a)<<endl;//输出什么?
floatb=0.0f;
cout<<(int)b<<endl;
cout<<(int&)b<<endl;
cout<<boolalpha<<((int)b==(int&)b)<<endl;//输出什么?
答:
分别输出false和true。
注意转换的应用。
(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。
因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。
对b的两种转换意义同上,但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。
注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?
前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。
这也就是a这个变量所占据的内存单元的值。
当(int&)a出现时,它相当于告诉它的上下文:
“把这块地址当做整数看待!
不要管它原来是什么。
”这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。
通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版
174、请简述以下两个for循环的优缺点(5分)
for(i=0;i<N;i++)
{
if(condition)
DoSomething();
else
DoOtherthing();
}
if(condition)
{
for(i=0;i<N;i++)
DoSomething();
}
else
{
for(i=0;i<N;i++)
DoOtherthing();
}
优点:
程序简洁
缺点:
多执行了N-1次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。
优点:
循环的效率高
缺点:
程序不简洁
175
voidGetMemory(char*p)
{
p=(char*)malloc(100);
}
voidTest(void)
{
char*str=NULL;
GetMemory(str);
strcpy(str,“helloworld”);
printf(str);
}
请问运行Test函数会有什么样的结果?
答:
程序崩溃。
因为GetMemory并不能传递动态内存,
Test函数中的str一直都是NULL。
strcpy(str,“helloworld”);将使程序崩溃。
176
char*GetMemory(void)
{
charp[]=“helloworld”;
returnp;
}
voidTest(void)
{
char*str=NULL;
str=GetMemory();
printf(str);
}
请问运行Test函数会有什么样的结果?
答:
可能是乱码。
因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,但其原现的内容已经被清除,新内容不可知。
177
voidGetMemory2(char**p,intnum)
{
*p=(char*)malloc(num);
}
voidTest(void)
{
char*str=NULL;
GetMemory(&str,100);
strcpy(str,“hello”);
printf(str);
}
请问运行Test函数会有什么样的结果?
答:
(1)能够输出hello
(2)内存泄漏
178
voidTest(void)
{
char*str=(char*)malloc(100);
strcpy(str,“hello”);
free(str);
if(str!
=NULL)
{
strcpy(str,“world”);
printf(str);
}
}
请问运行Test函数会有什么样的结果?
答:
篡改动态内存区的内容,后果难以预料,非常危险。
因为free(str);之后,str成为野指针,
if(str!
=NULL)语句不起作用。
179、请阅读以下一段程序,并给出答案。
classA
{
public:
A(){doSth();}
virtualvoiddoSth(){printf(“IamA”);}
};
classB:
publicA
{
public:
virtualvoiddoSth(){printf(“IamB”);}
};
Bb;
执行结果是什么?
为什么?
答:
执行结果是IamA
因为b对象构造时调用基类A的构造函数A(),得此结果。
180实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;
答:
双向链表删除一个节点P
template<classtype>voidlist<type>:
:
delnode(intp)
{
intk=1;
listnode<type>*ptr,*t;
ptr=first;
while(ptr->next!
=NULL&&k!
=p)
{
ptr=ptr->next;
k++;
}
t=ptr->next;
cout<<”你已经将数据项“<<t->data<<”删除”<<endl;
ptr->next=ptr->next->next;
length–;
deletet;
}
在节点P后插入一个节点:
template<classtype>boollist<type>:
:
insert(typet,intp)
{
listnode<type>*ptr;
ptr=first;
intk=1;
while(ptr!
=NULL&&k<p)
{
ptr=ptr->next;
k++;
}
if(ptr==NULL&&k!
=p)
returnfalse;
else
{
listnode<type>*tp;
tp=newlistnode<type>;
tp->data=t;
tp->next=ptr->next;
ptr->next=tp;
length++;
returntrue;
}
}
181.完成下列程序
*
*.*.
*..*..*..
*…*…*…*…
*….*….*….*….*….
*…..*…..*…..*…..*…..*…..
*……*……*……*……*……*……*……
*…….*…….*…….*…….*…….*…….*…….*…….
#include<iostream>
usingnamespacestd;
constintn=8;
main()
{
inti;
intj;
intk;
for(i=n;i>=1;i–)
{
for(j=0;j<n-i+1;j++)
{
cout<<”*”;
for(k=1;k<n-i+1;k++)
{
cout<<”.”;
}
}
cout<<endl;
}
system(“pause”);
}
182完成程序,实现对数组的降序排序
#include<iostream>
usingnamespacestd;
voidsort(int*arr,intn);
intmain()
{
intarray[]={45,56,76,234,1,34,23,2,3};
sort(array,9);
for(inti=0;i<=8;i++)//曾经在这儿出界
cout<<array[i]<<”“;
cout<<endl;
system(“pause”);
}
voidsort(int*arr,intn)
{
inttemp;
for(inti=1;i<9;i++)
{
for(intk=0;k<9–i;k++)//曾经在这儿出界
{
if(arr[k]<arr[k+1])
{
temp=arr[k];
arr[k]=arr[k+1];
arr[k+1]=temp;
}
}
}
}
183.以下两条输出语句分别输出什么?
[C++难]
floata=1.0f;
cout<<(int)a<<endl;
cout<<(int&)a<<endl;
cout<<boolalpha<<((int)a==(int&)a)<<endl;//输出什么?
floatb=0.0f;
cout<<(int)b<<endl;
cout<<(int&)b<<endl;
cout<<boolalpha<<((int)b==(int&)b)<<endl;//输出什么?
1
1065353216
boolalpha0
0
0
boolalpha1
51.以下反向遍历array数组的方法有什么错误?
[STL易]
vectorarray;
array.push_back
(1);
array.push_back
(2);
array.push_back(3);
for(vector:
:
size_typei=array.size()-1;i>=0;–i)//反向遍历array数组
{
cout<<array[i]<<endl;
}
184写一个函数,完成内存之间的拷贝。
[考虑问题是否全面]
答:
void*mymemcpy(void*dest,constvoid*src,size_tcount)
{
char*pdest=static_cast<char*>(dest);
constchar*psrc=static_cast<constchar*>(s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 笔试题库之编程问答题 150200道 笔试 题库 编程 问答题 150200