c语言笔试题,C++笔试题汇总(3)

1. 以下三条输出语句分别输出什么?
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* 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”以常量形式存于静态数据区,而它们自己仅是指
向该区首地址的指针,相等。
2. 以下代码中的两个sizeof 用法有问题吗?
void UpperCase( char str[] ) // 将str 中的小写字母转换成大写字母
{
for( size_t i=0; iif( 'a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str 字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;
答:函数内的sizeof 有问题。根据语法,sizeof 如用于数组,只能测出静态数组的大小,无法检测动态分
配的或外部数组大小。函数外的str 是一个静态定义的数组,因此其大小为6,函数内的str 实际只是一个
指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof 作用于上只将其当指针看,一个指针
为4 个字节,因此返回4。
3. 非C++内建型别A 和B,在哪几种情况下B 能隐式转化为A?
答:
a. class B : public A { ……} // B 公有继承自A,可以是间接继承的
b. class B { operator A( ); } // B 实现了隐式转化为A 的转化
c. class A { A( const B& ); } // A 实现了non-explicit 的参数为B(可以有其他带默认值的参数)构
造函数
d. A& operator= ( const A& ); // 赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个
4. 以下代码有什么问题?
struct Test
{
Test( int ) {}
Test() {}
void fun() {}
};
void main( void )
{
Test a(1);
a.fun();
Test b();
b.fun();
}
答:变量b 定义出错。按默认构造函数定义对象,不需要加括号。
5. 以下代码有什么问题?
cout << (true?1:"1") << endl;
答:三元表达式“?:”问号后面的两个操作数必须为同一类型。
6. 以下代码能够编译通过吗,为什么?
unsigned int const size1 = 2;
char str1[ size1 ];
unsigned int temp = 0;
cin >> temp;
unsigned int const size2 = temp;
char str2[ size2 ];
答:str2 定义出错,size2 非编译器期间常量,而数组定义要求长度必须为编译期常量。
7. 以下反向遍历array 数组的方法有什么错误?
vector array;
array.push_back( 1 );
array.push_back( 2 );
array.push_back( 3 );
for( vector::size_type i=array.size()-1; i>=0; --i ) // 反向遍历array 数组
{
cout << array[i] << endl;
}
答:首先数组定义有误,应加上类型参数:vector array。其次vector::size_type 被定义为
unsigned int,即无符号数,这样做为循环变量的i 为0 时再减1 就会变成最大的整数,导致循环失去控
制。
8. 以下代码中的输出语句输出0 吗,为什么?
struct CLS
{
int m_i;
CLS( int i ) : m_i(i) {}
CLS()
{
CLS(0);
}
};
CLS obj;
cout << obj.m_i << endl;
答:不能。在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,
而不会执行其后的初始化表达式。只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。
9. C++中的空类,默认产生哪些类成员函数?
答:
class Empty
{
public:
Empty(); // 缺省构造函数
Empty( const Empty& ); // 拷贝构造函数
~Empty(); // 析构函数
Empty& operator=( const Empty& ); // 赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const; // 取址运算符const
};
10. 以下两条输出语句分别输出什么?
float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么?
float b = 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<<及==选择正确的重载版本。
11. 以下代码有什么问题?
typedef vector IntArray;
IntArray array;
前言: string 的角色
1 string 使用
1.1 充分使用string 操作符
1.2 眼花缭乱的string find 函数
1.3 string insert, replace, erase 2 string 和C 风格字符串
3 string 和Charactor Traits
4 string 建议
5 小结
6 附录前言: string 的角色
C++ 语言是个十分优秀的语言,但优秀并不表示完美。还是有许多人不愿意使用C 或者C++,为什么?
原因众多,其中之一就是C/C++的文本处理功能太麻烦,用起来很不方便。以前没有接触过其他语言时,
每当别人这么说,我总是不屑一顾,认为他们根本就没有领会C++的精华,或者不太懂C++,现在我接
触perl, php, 和Shell 脚本以后,开始理解了以前为什么有人说C++文本处理不方便了。
举例来说,如果文本格式是:用户名电话号码,文件名name.txt
Tom 23245332
Jenny 22231231
Heny 22183942
Tom 23245332
...
现在我们需要对用户名排序,且只输出不同的姓名。
那么在shell 编程中,可以这样用:
awk '{print $1}' name.txt | sort | uniq
简单吧?
如果使用C/C++ 就麻烦了,他需要做以下工作:
先打开文件,检测文件是否打开,如果失败,则退出。
声明一个足够大得二维字符数组或者一个字符指针数组
读入一行到字符空间
然后分析一行的结构,找到空格,存入字符数组中。
关闭文件
写一个排序函数,或者使用写一个比较函数,使用qsort 排序
遍历数组,比较是否有相同的,如果有,则要删除,copy...
输出信息
你可以用C++或者C 语言去实现这个流程。如果一个人的主要工作就是处理这种类似的文本(例如做
apache 的日志统计和分析),你说他会喜欢C/C++么?
当然,有了STL,这些处理会得到很大的简化。我们可以使用fstream 来代替麻烦的fopen fread fclose,
用vector 来代替数组。最重要的是用string 来代替char * 数组,使用sort 排序算法来排序,用unique
函数来去重。听起来好像很不错。看看下面代码(例程1):
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude
using namespace std;
int main(){
ifstream in("name.txt");
string strtmp;
vector vect;
while(getline(in, strtmp, '\n'))
vect.push_back(strtmp.substr(0, strtmp.find(' ')));
sort(vect.begin(), vect.end());
vector::iterator it=unique(vect.begin(), vect.end());
copy(vect.begin(), it, ostream_iterator(cout, "\n"));
return 0;
}
也还不错吧,至少会比想象得要简单得多!(代码里面没有对错误进行处理,只是为了说明问题,不要效
仿).
当然,在这个文本格式中,不用vector 而使用map 会更有扩充性,例如,还可通过人名找电话号码等等,
但是使用了map 就不那么好用sort 了。你可以用map 试一试。
这里string 的作用不只是可以存储字符串,还可以提供字符串的比较,查找等。在sort 和unique 函数
中就默认使用了less 和equal_to 函数, 上面的一段代码,其实使用了string 的以下功能:
存储功能,在getline() 函数中
查找功能,在find() 函数中
子串功能,在substr() 函数中
string operator < , 默认在sort() 函数中调用
string operator == , 默认在unique() 函数中调用
总之,有了string 后,C++的字符文本处理功能总算得到了一定补充,加上配合STL 其他容器使用,其
在文本处理上的功能已经与perl, shell, php 的距离缩小很多了。因此掌握string 会让你的工作事半功
倍。
Tags:  华为c语言笔试题 华为c笔试题 软件测试笔试题3 c笔试题 c语言笔试题

延伸阅读

最新评论

发表评论