2012年(158)
分类: C/C++
2012-11-16 09:45:30
1. 以下三条输出语句分别输出什么?[C易]
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; // 输出什么?
答:第三个未定义
2. 非C++内建型别 A 和 B,在哪几种情况下B能隐式转化为A?[C++中等]
答:
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& ); // 赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个
3. 以下代码中的两个sizeof用法有问题吗?[C易]
void UpperCase( char str[] ) // 将 str
中的小写字母转换成大写字母
{
for( size_t i=0; i
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str字符长度为:
" << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str
);
cout << str << endl;
答:参数中数组类型退化为指针
4. 以下代码有什么问题?[C难]
void char2Hex( char c ) // 将字符以16进制表示
{
char
ch = c/0x10 + '0'; if( ch > '9' ) ch += ('A'-'9'-1);
char cl = c%0x10
+ '0'; if( cl > '9' ) cl += ('A'-'9'-1);
cout << ch << cl
<< ' ';
}
char str[] = "I love 中国";
for( size_t i=0;
i
cout <<
endl;
答:char可能是signed char的,这取决于编译器。对负数进行模除时……
5. 以下代码有什么问题?[C++易]
struct Test
{
Test( int ) {}
Test()
{}
void fun() {}
};
int main( void )
{
Test a(1);
a.fun();
Test b();
b.fun();
}
答:Test b(); 是个函数声明
6. 以下代码有什么问题?[C++易]
cout << (true?1:"1") <<
endl;
答:编译期不能确定类型,语法上肯定是不对的
7. 以下代码能够编译通过吗,为什么?[C++易]
unsigned int const size1 = 2;
char str1[
size1 ];
unsigned int temp = 0;
cin >> temp;
unsigned int const
size2 = temp;
char str2[ size2 ];
答:数组数目要求是编译期能过确定的立即数,而不是const就行了
8. 以下代码中的输出语句输出0吗,为什么?[C++易]
struct CLS
{
int m_i;
CLS(
int i ) : m_i(i) {}
CLS()
{
CLS(0);
}
};
CLS obj;
cout << obj.m_i <<
endl;
答:CLS(0)并不是调用构造函数,而是创建了一个无名的临时对象
9. C++中的空类,默认产生哪些类成员函数?[C++易]
答:
class Empty
{
public:
Empty(); // 缺省构造函数
Empty( const Empty&
); // 拷贝构造函数
~Empty(); // 析构函数
Empty& operator=( const Empty& ); // 赋值运算符
Empty*
operator&(); // 取址运算符
const Empty* operator&()
const; // 取址运算符 const
};
10. 以下两条输出语句分别输出什么?[C++难]
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; // 输出什么?
11. 以下反向遍历array数组的方法有什么错误?[STL易]
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;
}
答:i可能是无符号类型的,即i>=0一直成立
12. 以下代码有什么问题?[STL易]
typedef vector IntArray;
IntArray
array;
array.push_back( 1 );
array.push_back( 2 );
array.push_back( 2
);
array.push_back( 3 );
// 删除array数组中所有的2
for( IntArray::iterator
itor=array.begin(); itor!=array.end(); ++itor )
{
if( 2 == *itor )
array.erase( itor );
}
答:删除时改变了array内部排列,迭代器错乱
13. 写一个函数,完成内存之间的拷贝。[考虑问题是否全面]
答:
void* mymemcpy( void *dest, const
void *src, size_t count )
{
char* pdest = static_cast
const char* psrc = static_cast
if( pdest>psrc && pdest
for( size_t i=count-1; i!=-1; --i )
pdest[i] =
psrc[i];
}
else
{
for( size_t i=0; i
}
return
dest;
}
int main( void )
{
char str[] = "0123456789";
mymemcpy( str+1, str+0, 9 );
cout << str << endl;
system( "Pause" );
return 0;
}
14. 对于内建类型,n != n,-n == n,以及 ++n 后还和原先值相等
分别是哪些可能
答:第一个可能是一个非法的浮点类型(NaN)
第二种可能是0,也可能是带符号的整数类型的最小值
比如 int n =
INT_MIN; 则 n 和 -n 相等。在 itoa 中使用的技巧类似 unsigned int x = -n;
第三种 bool n =
true;
faf882012-11-16 20:13:13
謝謝分享~
与其羡慕别人富有!到不如自己来创造自己的财富!
只要您愿意做,只要您愿意开始做,不用入会费,不用加盟金,
免费注册网址>> http://migre.me/bFG4O
觉得适合你再投入(合法经营,需满18岁)
网友评论2012-11-16 10:00:15
周星星
第8题:
在C99中增加了变长数组,所以能够编译通过,目前的C++中并没有这个特性,未来估计也不太会加入这个特性。gcc支持C99,所以它在C++中也加入了变长数组,所以可以认为这个特性是gcc特有的。(这一题是考察运行时常量和编译期常量的区别,数组长度应当是编译期就能确定的常量,运行时常量不可以。)
之所以str2为乱码,是因为它还没有被赋值。
数组是不作存取范围检查的,因为C/C++规定,不能为不需要的特性增加运行负担。而且这个特性在某些场合还可能用到,比如变长的BMP头:struct BMP_HEADER { ...; RGB[1] data; }; data长度不定,所以运行时分配大小 BMP_HEADER* p_bmp_header = (BMP_HEADER*)operator new(sizeof(BMP_HEADER)+(需要的数据长度-1)*sizeof(RGB));。
第3题:
浮点数转化为整数时,是取整,而化为整数引用时 (int&)a