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”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。   
    
    
2. 以下代码中的两个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。   
    
    
3. 非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() {}
};
int main()
{
Test a(1);
a.fun();
Test b();
b.fun();
       return 0;
}

答:变量b定义出错。按默认构造函数定义对象,不需要加括号。   
    
    
5.以下代码有什么问题?[C++易]

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

:两侧值类型应相同   
    
6.以下代码能够编译通过吗,为什么?[C++易]   
   

   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数组的方法有什么错误?[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就会变成最大的整数,导致循环失去控制。   
    
8.以下代码中的输出语句输出0吗,为什么?[C++易]

   struct    CLS
{
int m_i;
CLS( int i ) : m_i(i) {}
CLS()
{
CLS(0);
}
};
CLS obj;
cout << obj.m_i << endl;

答:不能。在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而不会执行其后的初始化表达式。只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。   
    
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; // 输出什么?

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

[root@ba face]# cat 03.cpp
#include <iostream>
#include <stdio.h> int main()
{
float a = 1.0f;
std::cout << (int)a << std::endl;
std::cout << (int&)a << std::endl;
std::cout << std::boolalpha << ((int)a == (int&)a) << std::endl; float b = 0.0f;
std::cout << (int)b << std::endl;
std::cout << (int&)b << std::endl;
std::cout << std::boolalpha << ((int)b == (int&)b) << std::endl; int* pa = (int*)&a;
printf("%#x\n", *pa); int* pb = (int*)&b;
printf("%#x\n", *pb); return 0;
}
[root@ba face]# g++ 03.cpp
[root@ba face]# ./a.out
1
1065353216
false
0
0
true
0x3f800000
0
[root@ba face]# printf %d 0x3f800000
1065353216[root@ba face]#
[root@ba face]#

  

11.以下代码有什么问题?[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--,使之从已经前移的下一个元素起继续遍历。   
      
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;
}

  

13.解码题

#include <stdio.h>

int encode(const void* raw_in, void* raw_out, unsigned int password, size_t len)
{
const unsigned char* in = (const unsigned char*)raw_in;
unsigned char* out = (unsigned char*)raw_out; unsigned int seed = password ^ 0xe9f929f1u;
for(size_t i = 0 ; i < len; ++i)
{
unsigned char a = (in[i] ^ seed) >> 5;
unsigned char b = ((((unsigned int)in[i]) << 16) ^ seed) >> (16-3);
a &= 7;
b &= 248;
a = 7 & (a ^ (b << 3));
out[i] = a | b;
seed = ((seed ^ in[i]) * 5393887 + in[i]);
} return 0;
} int decode(const void* raw_in, void* raw_out, unsigned int password, size_t len)
{
const unsigned char* in = (const unsigned char*)raw_in;
unsigned char* out = (unsigned char*)raw_out; unsigned int seed = password ^ 0xe9f929f1u;
for (size_t i = 0 ; i < len; ++i)
{ // 请在此处补全代码
unsigned char a = in[i] & 7;
unsigned char b = in[i] & 248;
a = (a << 5) ^ seed & 224;
b = (((unsigned int)b) << 13 ^ seed) >> 16 & 31;
out[i] = a | b;
seed = ((seed ^ out[i]) * 5393887 + out[i]);
}
return 0;
}
int main()
{
const unsigned char buf1[] = {
0xd0, 0xd8, 0x7d, 0x96, 0x55, 0x27, 0xfc, 0x1c, 0x96, 0x97,
0xa5, 0x08, 0x1b, 0xd0, 0x06, 0xf7, 0x36, 0xac, 0x57, 0x3b,
0x41, 0xad, 0x46, 0x71, 0xf4, 0x59, 0xda, 0xe3, 0xf7, 0xed,
0x06, 0xb7, 0xee, 0x80, 0xe9, 0x8f, 0x9c, 0x01, 0x02, 0xe5,
0xe4, 0x51, 0xed, 0x8e, 0xd6, 0xec, 0xbd, 0x68, 0x2f, 0x41,
0xcd, 0x0d, 0x15, 0x4f, 0x93, 0xd1, 0x61, 0xc3, 0x5f, 0x8d,
0x65, };
unsigned char buf2[100] = {};
const unsigned int password = 0x31484625u;
const size_t len = sizeof(buf1);
decode(buf1, buf2, password, len);
printf("%s\n", buf2);
return 1;
}

  

几道c/c++练习题的更多相关文章

  1. j接近50道经典SQL练习题,附建表SQL解题SQL

    说明 本文章整理了47道常见sql联系题,包括建表语句,表结构,习题列表,解题答案都涵盖在本文章内.文末提供了所用SQL脚本下载链接.所有解题答案都是本人自己写的,广大读者如果在阅读使用中,有任何问题 ...

  2. 经典51道SQL查询练习题

    数据表介绍 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course( ...

  3. 百道Python入门级练习题(新手友好)第一回合——矩阵乘法

    题目描述 [问题描述] 编写程序,完成3*4矩阵和4*3整数矩阵的乘法,输出结果矩阵. [输入形式] 一行,供24个整数.以先行后列顺序输入第一个矩阵,而后输入第二个矩阵. [输出形式] 先行后列顺序 ...

  4. 2016/3/16 45道MySQL 查询练习题

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  5. 50道高级sql练习题;大大提高自己的sql能力(附具体的sql)

    问题及描述:--1.学生表Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别--2.课程表Course(CID ...

  6. 几个python练习题

    从python公众号里面看到了几道python的练习题,就拿来练练手,结果上手了发现自己还是特别水,不是很难的8道题,我只做出来5道,其中还3道题卡住了,边查边做的.原题链接在这里:http://py ...

  7. 【SDOI2009】HH的项链

    洛谷题目链接 题意: 给定一个长5w静态的序列,询问20w次,每次询问查找一个区间内的元素种类数 染色问题神烦啊,最近刚会做,感觉都可以用统一的方法 首先要算出与一个元素相同的最邻近的上一个元素的位置 ...

  8. 翻阅《数据结构与算法javascript描述》--数组篇

    导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...

  9. 数据结构与算法javascript描述

    <数据结构与算法javascript描述>--数组篇 导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScri ...

随机推荐

  1. Netty中的Channel之数据冲刷与线程安全(writeAndFlush)

    本文首发于本博客,如需转载,请申明出处. GitHub项目地址 InChat 一个轻量级.高效率的支持多端(应用与硬件Iot)的异步网络应用通讯框架 前言 本文预设读者已经了解了一定的Netty基础知 ...

  2. 可编辑且宽度自适应input

    默认的input项是比较难看的,并且它的宽度还无法随着输入而变化,这样未免有些呆板,不过借助JavaScript可以达到宽度自适应的效果,下面为了方便使用了jQuery: <div class= ...

  3. C#中try catch finally 用法

    1.将预见可能引发异常的代码包含在try语句块中. 2.如果发生了异常,则转入catch的执行. catch有几种写法: catch  这将捕获任何发生的异常. catch(Exception e)  ...

  4. 关于boostrap的modal隐藏问题(前端框架)

    Modal(模态框) 首先,外引boostrap和Jquery的文件环境: <link rel="stylesheet" href="https://cdn.sta ...

  5. 在 vue cli3 的项目中配置双服务,模拟 ajax 分页请求

    最近安装了下vue cli3版本,与 cli 2 相比,文件少了,以前配置方法也不管用了.demo 中的大量的数据,需要做成 ajax 请求的方式来展示数据,因此,需要启动两个服务,一个用作前端请求, ...

  6. Python之Scripy框架

    为什么要用到cmd界面 --- 在这里操作的是Scripy框架的指令,不是Python代码 Parse --- Scripy的回调函数 fiddler --- 用于爬取JS存储数据的页面 项目: 1. ...

  7. 如何快速搭建一个基于ServiceStack框架的web服务

    ServiceStack是一个高性能的.NET Web Service 平台,能够简化开发高性能的REST (支持JSON,XML,JSV,HTML,MsgPack,ProtoBuf,CSV等消息格式 ...

  8. 配置sonarqube与gitlab sso认证集成

    1.安装插件 sonar插件地址:https://github.com/gabrie-allaigre/sonar-auth-gitlab-plugin 安装插件: 下载插件然后通过maven打包然后 ...

  9. 在Winform开发中使用Grid++报表

    之前一直使用各种报表工具,如RDLC.DevExpress套件的XtraReport报表,在之前一些随笔也有介绍,最近接触锐浪的Grid++报表,做了一些测试例子和辅助类来处理报表内容,觉得还是很不错 ...

  10. CSS有哪些引入方式,link和@import的区别

    3种方式哦,行内样式.内部样式表.外部样式表 1. 行内样式又称为内联样式,直接在HTML标签的style属性中添加css. 会导致 HTML 代码变得冗长 2. 内部样式表又称为嵌入方式,是在HTM ...