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<sizeof(str)/sizeof(str[0]); ++i )
if( '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;
答:参数中数组类型退化为指针
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<strlen(str); ++i )
char2Hex( str[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<char*>( dest );
const char* psrc = static_cast<const char*>( src );
if( pdest>psrc && pdest<psrc+cout ) 能考虑到这种情况就行了
{
for( size_t i=count-1; i!=-1; --i )
pdest[i] = psrc[i];
}
else
{
for( size_t i=0; i<count; ++i )
pdest[i] = psrc[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;
怎么没答案?
都是些简单的题目,我的原意是汇总试题,然后对试题进行类别分析,看看有没有什么规律,但现在兴趣淡下来了。
你还是把答案公布在后面,照顾一下我们这些菜鸟好不好?
我想问问学C++有什么捷径可走不?
to 菜鸟问题:
“我的原意是汇总试题,然后对试题进行类别分析,看看有没有什么规律,但现在兴趣淡下来了。”
等我有空的时间加上,谢谢!
to 超级菜鸟:
:)假如真有捷径的话,那么大家都走这条捷径,也就不能称为捷径了。
强烈要求有答案呀。。这样看起来爽点呀。。能学点东东
搞什么啊,没答案的,浪费我时间
自己调试一下不就知道了嘛!^_^
《高质量CC++编程》里有一套很好的测试题,很多公司的面试都是用它的
不过,最后一道。考虑问题是否全面的。 不太敢苟同。
他并没有明确要求功能和限制。
有些检查,多了,反而会降低性能。程序员应该自己注意不应该的错误写法。
就像C++对 a/0 不负责以及 野指针 不负责一样。
由使用者自己负责。
楼主这样很好呀,学习不是看答案看出来的,是要找一个自己努力的方向然后努力做出来的!多做,自己才能发现问题,才有好的提高!
当然了,人家是所谓的介与牛A跟牛B的人物了
自然不会理会所谓的才鸟的心情了
**********:
你这样说算什么?攻击人,还是夸人?我不好说,我也菜,每个高手都是从菜开始的,并不是不理会,而是在技术圈子呆久了觉得有些事很自然、很简单罢了,你要是说说你的心情人家一定不理会?我看不一定吧:)
周前辈:
第一题我用DEVC++所得是:
0
0
1
(我把boolalpha去掉了)
而VC++则是:
false
false
false
估计可能是被优化了的结果:)
你用的是哪个版本的VC++?我用VC++6.0测试的结果是:
false
false
true
当然,我的意思不是说一定要第三个为true,这应当由编译器自己决定。
to:周前辈
我用的也是VC++6.0:)
后来发现它与编译的选项有关:)
经过多次试验发现,只要用自定义优化它就是false否则为true:)
唉,只可惜我们单位限制我们上网,以后可能就很少有机会与前辈学习了!不过我想上也是可以的,就是得晚点儿了:)
第一题我用g++的结果是:
false
false
true
为什么说“第三个为true,这应当由编译器自己决定”?
1和2为false毫无疑问,因为它们存在于不同的空间中;
而三呢?它可以相同以节约空间,当然也可以不同了。
第八题是能够编译通过的?
没说编译不过呀!
在支持C99标准的编译器上当然能编译通过。
9. 指点一下
CLS( int i ) : m_i(i) {}
CLS()
{
CLS(0); // 这其实不是调用CLS(int)函数,而是创建了一个临时的无名对象。
}
什么意思?
size_t(-1)是最大的一个size_t值,所以 i>-1 永远是false。
to 周星星:
小可在dev c++下调试时感觉奇怪就发了出来。
使用 i != -1 得到的是:0012345678
使用 i > -1 则是: 0123456789
正想问你,结果你招了。
没有答案。
天啦,我好晕,高手一片一片的,我连个菜鸟都称不上!!!!晕!!!
谢谢你,星星,我找到了一个学习的好网站,真的很谢谢你!!!!
我之所以不用QQ等,是因为我更喜欢在vckbase的水园里聊天,大家一起聊,很有趣的,哪天你试试,一定会上瘾,哈哈!
毫无意义的测试题,能考察出什么,某些语法的奇技淫巧?
有多少程序员写这样的程序的?
第七题转化为16进制的代码有错吗?没有找出来,而且用vc调试也过了。
对于char,C/C++并没有规定它的符号,有的编译器把它认作signed char,有的编译器把它认作unsigned char。
如果是有符号的,那么 c/0x10 就是一个负数,c/0x10 + '0' 就不对了。
而且更严重的是,对于负数,比如 -10 % 3 的结果在C++中目前并没有定义,只在C99中有定义。
多谢,回的好快啊!又请教3题中的(int&)是指什么?取地址又转化为int型吗?我用vc编译得到:
1
1065353216
false
0
0
true
再请教13题b. class B { operator A( ); } 这里operator A()指什么啊?没看明白
第三题:
没有学过C++吧?这个&不是取地址,而是"引用",(int&)a 相当于 *(int*)&a。
记得在我第一次遇到强制类型转化时,比如 float a=1.0f 转化为 int b,我就问了一个问题,是将a的字面值1.0f转化为整型,还是将a的位值转化为整型?1.0f在内存中的位值为0x0012ff7c。
第13题:
这也是C++中的语法,重载了B到A的转化。B有了operator A()之后,就可以 B b; A a = b;,a = b 相当于
a.operator=( b.operator A() )。
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; // 输出什么?
前者输出1,1065353216,false
后者输出0,0,true
why?
因为 0 和 0.0f 的编码一样,而其他数字就不行了。
对于 C++标准 和 老旧的C标准,堆数组元素数目必须是编译期常量,size1 是编译期常量,而 temp 不是,temp的值要在运行时才知道。
对于 C99标准,它们都是合法的。
8. 以下代码能够编译通过吗,为什么?[C++易]
unsigned int const size1 = 2;
char str1[ size1 ];
unsigned int temp = 0;
cin >> temp;
unsigned int const size2 = temp;
char str2[ size2 ];
=======================
C++ 根本没有定义这种“动态”数组。在这点上,C99 和 C++ 分道扬镳了。C++ 可以用 STL 中的 vector 作为“动态”数组。
这段代码不能通过编译!
啊啊!有一点要补充一下。
===================
unsigned int const size1 = 2;
char str1[ size1 ];
===================
这个可以通过,因为 size1 是编译时就已经确定了的整数恒量
========================
cin >> temp;
unsigned int const size2 = temp;
char str2[ size2 ];
========================
这个不行!因为 size2 的值编译时未知!
最大的问题在于 void main,无论是C还是C++,无论是过去的C/C++,还是现在的C/C++,都规定main的返回值必须是int,所以写成 void main 是绝对不可原谅的。
(最初的C只有int一种类型,因为只有一种类型,所以类型可以省略;其后的C增加了很多内建类型,但为了兼容旧代码,所以保留了部分传统,那就是不写返回类型的函数默认返回类型为int,这就是某些旧代码中可以写 main 的原因;但要记住,那已经是历史了,C++ 以及 现在的C,都不允许写成 main,必须写成 int main,而写成 void mian 从来是不合法的)
第二个问题就是 Test b() ,按照标准它其实是一个函数申明,等同于 Test b( void );,所以应当写成 Test b 或 Test b = Test()。
第8题的内容可以编译,可是使用有个问题不明白,希望星星能够帮忙。
我让temp=2时候,打印出来的str2后面有很多乱码。
而且就算size2等于2了,我依然可以用str2[2],str2[3]等,这里算是bug吗?
还有13题不很明白,为什么两个一样的操作结果却不一样?
0 .0f的时候为什么就不是将其位置转化为整型了呢?
谢谢啦
第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 相当于 *(int*)&a。
所以 float a=1.0f; (int)a 和 (int&)a 是不同的,1.0f在内存中是 3F800000,作为int看待的话是1065353216,所以(int)a等于1,(int&)a等于1065353216。
而之所以当b=0.0f时,(int)b 和 (int&)b 相等,是因为0.0f和0的内存布局正好一致,都是 00000000。
请问星星如何打开二进制程序?谢谢!我要做毕业设计,什么也不会,所以请告诉的详细一点,感激!
- 访问:318444次
- 积分:2050分
- 排名:第2名
- 随笔:205篇
- 评论:2765条
随笔分类
随笔归档
个人相册
阅读排行榜
- windows下最好的C++ IDE (24347)
- 实时数据库的简介(初稿) (17646)
- 浮点数 和 EPSILON (文章越写越啰嗦) (8886)
- 用OpenCV显示一幅图像到指定的窗体 (6953)
- 个人资料 (6952)
- 访客留言 (6459)
- 代码片断 (5509)
- 读取NTFS的USN(获取文件的历史操作记录,即使这个文件已被删除) (4961)
- [夜语] “兆”是10的几次方 (4219)
- Qt 4.7.3 之 代理认证 (4080)
评论排行榜
- windows下最好的C++ IDE (473)
- 实时数据库的简介(初稿) (406)
- 个人资料 (176)
- 访客留言 (146)
- 代码片断 (100)
- 测试一下 Intel C++8.0 对模板的支持程度 (64)
- C/C++试题(汇总中) (48)
- 佛学佳句 (47)
- 普通话 与 粤语 (41)
- 浮点数 和 EPSILON (文章越写越啰嗦) (40)