打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C 笔试题(一)

        进入六月了,四年的大学生活已接近了尾声,喜悦、流恋、忧郁,抑或迷茫、惆怅,不管是一个怎样的心绪,我用忧郁的眼神审视着周围的一切,变的冷漠??? 潇洒的活着,却丝毫感受不到快乐。浮躁,这个词估计可以很好的来形容现在的我.

       牢骚了很多,和c 当然没有半毛钱的关系,本来快毕业了,也没有什么事情可干,只需要享受这仅剩的时光即可,可我为了换工作,还得去看看这些琐碎的知识 ,为了笔试。下面多数是我在网上找的题,通过运行调试,弄明白了,所以放在这里共大家一起学习,如有错误还请指正。还有牢骚太多还望包涵。

1. 以下四条输出语句分别输出什么?
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";

cout<<ends<<str1<<ends<<str3<<ends<<str5<<endl;
cout << boolalpha << ( str1==str2 ) << endl; //
cout << boolalpha << ( str3==str4 ) << endl; //
cout << boolalpha << ( str5==str6 ) << endl; //

答:输出结果是:abc abc abc    false false true;str1str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3str4同上,只是按const语义,它们所指向的数据区不能修改。str5str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。

2. 以下代码中的两个sizeof用法有问题吗?
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;

答:输出结果是:6,ABCDe;函数内的sizeof有问题。sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其字符长度是6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此在函数中,只转换了前四个字符。

3. 以下代码有什么问题?

struct Test

{

     Test( int ) {}

     Test() {}

     void fun() {}

};

void main( void )

{

     Test a(1);

     a.fun();

     Test b();

     b.fun();

}

答:变量b定义出错。按默认构造函数定义对象,不需要加括号。C/C 中的结构和类的区别很小,只不过一个是值类型,一个是引用类型,而且缺省Public、Private等修饰符时,结构默认是公共的,类默认是私有的。

4.在下面的语句中错误的是 :
A、int n=5;        int y[n]
B、const int n=5;    int y[n]
C、in n=5;         int *py=new int[n];
D、const int n=5;    int *py=new int[n]

答:A, 数组在声明的时候大小必须是固定的,但是在A里面n是一个变量;即在程序执行时会去找n的值,因为n=5;不是常量,此时n的值是默认的0,因此会抛出不能分配常量大小为零的数组的错误。

5. 以下代码有什么问题?

cout << (true?1:"0") << 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的声明应指明数据类型,如:vector<int> array,vector<int>::size_type ;其次,size_type类型为unsigned int 类型,当i=0时,减一变成-1,进而转换成很大的数,使数组不可控。

8. 以下代码中的输出语句输出吗,为什么?

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为参数构造了一个整型数,该整数的值是,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。
  注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,以浮点数形式存放在内存中,按ieee754规定,其内容为x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容x0000803F按整数解释,其值正好就是(十进制数)。
  通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。

11. 以下代码有什么问题?

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.erase(itor)后,会自动前移,这样就会漏掉迭代项。

12. 写一个函数,完成内存之间的拷贝。[考虑问题是否全面]

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;
}

void main( void )
{

 char str[] = "0123456789";
    mymemcpy( str 1, str 0, 9 );
    cout << str << endl;

        mymemcpy( str, str 5, 5 );
    cout << str << endl;

    system( "Pause" );

}

看到这个拷贝函数的运行结果后,对c 指针不是很熟悉的可能看不太明白,以主函数中的输出为例,我来发表一下自己的一点理解吧,如有错误欢迎指正。

第一次调用函数mymemcpy( str 1, str 0, 9 ); 时,str 1 传入的是从字符"1"地址开始的指针地址,而str 0 传入的是指针数组str的首地址指针,进入函数内部以后,两个参数就和外部的指针数组str基本脱离了关系,转换成字符指针后,dest是"123456789",src是"0123456789"因为地址是交叉的,所以拷贝内存时,执行if内语句,这样dest字符就变成了012345678,因为dest和str指向的是同一块内存空间,而str从1地址开始变成了012345678,加上其原本首地址 0不变,所以输出str时变成0012345678。如果不太明白可以看下另一篇日志,内存拷贝函数,应该能很好的理解。


 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
c++知识 - 洋男的日志 - 网易博客
C++经典面试题
string中c_str()、data()、copy(p,n)函数的用法
最全的C\C 面试题解(2)
285-304
C++指针
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服