c/c++笔试题大解析

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;   //    输出什么?   

    

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

    

    

  12.    以下代码中的两个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;   

    

  答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。   

    

    

   13.   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&   );    //   赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个   

    

    

  4.    以下代码有什么问题?[C++易]   

  struct    Test   

  {   

          Test(    int    )   {}   

          Test()    {}   

          void    fun()    {}   

  };   

  void    main(    void   )   

  {   

          Test    a(1);   

          a.fun();   

          Test    b();   

          b.fun();   

  }   

    

  答:变量b定义出错。按默认构造函数定义对象,不需要加括号。   

    

    

  5.    以下代码有什么问题?[C++易]   

  cout    <<   (true?1:"1")    <<   endl;   

  答:三元表达式“?:”问号后面的两个操作数必须为同一类型。   

    

    

  8.    以下代码能够编译通过吗,为什么?[C++易]   

  unsigned    int    const   size1    =    2;   

  char    str1[    size1   ];   

  unsigned    int    temp   =    0;   

  cin    >>    temp;   

  unsigned    int    const   size2    =    temp;   

  char    str2[    size2   ];   

   答:无错 

    

    

  2.    以下反向遍历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;   

  }   

    

  答:首先数组定义有误,应加上类型参数:vector<int>    array。其次vector::size_type被定义为unsigned   int,即无符号数,这样做为循环变量的i为0时再减1就会变成最大的整数,导致循环失去控制。   

    

    

  9.    以下代码中的输出语句输出0吗,为什么?[C++易]   

  struct    CLS   

  {   

          int    m_i;   

          CLS(    int    i   )    :    m_i(i)   {}   

          CLS()   

          {   

                  CLS(0);   

          }   

  };   

  CLS    obj;   

  cout    <<    obj.m_i   <<    endl;   

    

  答:不能。在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而不会执行其后的初始化表达式。只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。   

    

    

   10.    C++中的空类,默认产生哪些类成员函数?[C++]   

  答:   

  class    Empty   

  {   

  public:   

          Empty();                                                     //    缺省构造函数   

          Empty(    const    Empty&   );                         //   拷贝构造函数   

          ~Empty();                                                   //    析构函数   

          Empty&    operator=(   const    Empty&    );   //   赋值运算符   

          Empty*   operator&();                               //   取址运算符   

          const    Empty*   operator&()   const;        //   取址运算符   const   

  };   

    

    

      

  3.    以下两条输出语句分别输出什么?[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;   //   输出什么?   

    

  答:分别输出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<<及==选择正确的重载版本。   

    

    

   6.   以下代码有什么问题?[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.erase(    itor   );”,被删除元素之后的内容会自动往前移,导致迭代漏项,应在删除一项后使itor--,使之从已经前移的下一个元素起继续遍历。   

      

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

  答:   

  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;   

  }   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的体育馆管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此体育馆管理系统利用当下成熟完善的SpringBoot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线选择试题并完成答题,在线查看考核分数。管理员管理收货地址管理、购物车管理、场地管理、场地订单管理、字典管理、赛事管理、赛事收藏管理、赛事评价管理、赛事订单管理、商品管理、商品收藏管理、商品评价管理、商品订单管理、用户管理、管理员管理等功能。体育馆管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:体育馆管理系统;SpringBoot框架;Mysql;自动化
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值