几道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”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。
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++练习题的更多相关文章
- j接近50道经典SQL练习题,附建表SQL解题SQL
说明 本文章整理了47道常见sql联系题,包括建表语句,表结构,习题列表,解题答案都涵盖在本文章内.文末提供了所用SQL脚本下载链接.所有解题答案都是本人自己写的,广大读者如果在阅读使用中,有任何问题 ...
- 经典51道SQL查询练习题
数据表介绍 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course( ...
- 百道Python入门级练习题(新手友好)第一回合——矩阵乘法
题目描述 [问题描述] 编写程序,完成3*4矩阵和4*3整数矩阵的乘法,输出结果矩阵. [输入形式] 一行,供24个整数.以先行后列顺序输入第一个矩阵,而后输入第二个矩阵. [输出形式] 先行后列顺序 ...
- 2016/3/16 45道MySQL 查询练习题
一. 设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...
- 50道高级sql练习题;大大提高自己的sql能力(附具体的sql)
问题及描述:--1.学生表Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别--2.课程表Course(CID ...
- 几个python练习题
从python公众号里面看到了几道python的练习题,就拿来练练手,结果上手了发现自己还是特别水,不是很难的8道题,我只做出来5道,其中还3道题卡住了,边查边做的.原题链接在这里:http://py ...
- 【SDOI2009】HH的项链
洛谷题目链接 题意: 给定一个长5w静态的序列,询问20w次,每次询问查找一个区间内的元素种类数 染色问题神烦啊,最近刚会做,感觉都可以用统一的方法 首先要算出与一个元素相同的最邻近的上一个元素的位置 ...
- 翻阅《数据结构与算法javascript描述》--数组篇
导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...
- 数据结构与算法javascript描述
<数据结构与算法javascript描述>--数组篇 导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScri ...
随机推荐
- 用v-bind:style时的问题
今天纠结了挺久一个问题,个人习惯是在HBuilder里先写好前端样式,在放.net去测试数据,但是发现一个问题 就是一个提示框跟随鼠标移动 提示框用v-bind:style绑定一个对象 DIV就是这句 ...
- 第二章:shiro身份验证
身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...
- 2016年第七届蓝桥杯javaB组 试题 答案 解析
1.煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有多少个煤 ...
- 安卓5.0系统怎么无Root激活XPOSED框架的方法
在大多团队的引流或业务操作中,基本上都需要使用安卓的强大Xposed框架,几天前,我们团队买来了一批新的安卓5.0系统,基本上都都是基于7.0以上系统,基本上都不能够获得Root的su权限,纵然一些能 ...
- 使用Android服务,实现报警管理器和广播接收器
介绍 几乎在所有平台上都有很多进程运行背景,它们被称为服务.可能在Android平台中有一些服务可以执行长时间运行的操作,这些操作在处理时不需要用户交互. 在本文中,借助预定义的Android警报服务 ...
- deepin linux 学习笔记(二)——文本编辑器
目录 deepin linux 学习笔记(二)--文本编辑器 前言 nano 小巧的命令行编辑器 通用 编辑 定位 排版 配置 vim 思路独特的超级编辑器 命令模式 插入模式 底线模式(末行模式) ...
- js实现自定义修改网页中表格信息
项目中的打印页面,为提高用户体验,需要增自定修改表格内容的功能,以下是使用示意图(双击td标签部分的内容,可自定义修改): 以下是js插件源码,存为edit.js文件: var tbl, tbt; v ...
- IIS发布的网站,内网和外网不能访问的解决办法
A.关闭防火墙.控制面板-Windows防火墙-打开或关闭Windows防火墙(不推荐) B.打开:控制面板-Windows防火墙-高级设置-入站规则,在入站规则窗口中找到”BranchCache内容 ...
- windows压缩图片
- anki server 错误与解决
anki 客户端 转载请注明出处 :http://www.cnblogs.com/qq-757617012/ 1.无法同步 是否突然停电,导致程序损坏(提示被防火墙或杀毒软件阻止) anki客 ...