Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988094
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

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        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    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( dest );
    const char* psrc = static_cast( src );
    if( pdest>psrc && pdest    {
        for( size_t i=count-1; i!=-1; --i )
                pdest[i] = psrc[i];
    }
    else
    {
        for( size_t i=0; 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;

阅读(9157) | 评论(48) | 转发(3) |
给主人留下些什么吧!~~

网友评论2012-11-16 09:57:46

周星星
因为 0 和 0.0f 的编码一样,而其他数字就不行了。

网友评论2012-11-16 09:57:29

至尊宝
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?

网友评论2012-11-16 09:57:14

周星星
第三题:
没有学过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() )。

网友评论2012-11-16 09:56:55

此心依依
再请教13题b. class B { operator A( ); } 这里operator A()指什么啊?没看明白

网友评论2012-11-16 09:56:39

此心依依
多谢,回的好快啊!又请教3题中的(int&)是指什么?取地址又转化为int型吗?我用vc编译得到:
1
1065353216
false
0
0
true