C++笔试题目大全(笔试宝典)(转)
1.new 、 delete 、 malloc 、 free 关系
delete 会调用对象的析构函数 , 和 new 对应 free 只会释放内存, new 调用构造函数。 malloc 与 free 是 C++/C 语言的标准库函数, new/delete 是 C++ 的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用 maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于 malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free 。因此 C++ 语言需要一个能完成动态内存分配和初始化工作的运算符 new ,以及一个能完成清理与释放内存工作的运算符 delete 。注意 new/delete 不是库函数。
总结:new和delete会自动调用对象的构造与析构函数而malloc与free不会;
new和delete式C++运算符,而malloc和free是C/C++标准库函数。
2.delete 与 delete [] 区别
MemTest*mTest1=newMemTest[10];
总结: delete 只会调用一次析构函数,而 delete[] 会调用每一个成员的析构函数。
3.C C++ JAVA 共同点,不同之处?
4. 继承优缺点。
5.C++ 有哪些性质(面向对象特点)
6. 子类析构时要调用父类的析构函数吗?
7. 多态,虚函数,纯虚函数
8. 求下面函数的返回值(微软)
int func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}
9. 什么是 “ 引用 ” ?申明和使用 “ 引用 ” 要注意哪些问题?
10. 将 “ 引用 ” 作为函数参数有哪些特点?
11. 在什么时候需要使用 “ 常引用 ” ?
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式: const 类型标识符 & 引用名 = 目标变量名;
int a ;
const int &ra=a;
ra=1; // 错误
a=1; // 正确
string foo( );
void bar(string & s);
bar(foo( ));
bar("hello world");
12. 将 “ 引用 ” 作为函数返回值类型的格式、好处和需要遵守的规则 ?
格式:类型标识符 & 函数名(形参列表及类型说明) { // 函数体 }
好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生 runtime error! 注意事项:
13.“ 引用 ” 与多态的关系?
引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。例 4
Class A; Class B : Class A{...}; B b; A& ref = b;
14.“ 引用 ” 与指针的区别是什么?
15. 什么时候需要 “ 引用 ” ?
16. 结构与联合有和区别?
17. 面关于 “ 联合 ” 的题目的输出?
# i nclude <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
答案: 266 ( 低位低地址,高位高地址,内存占用情况是 Ox010A )
6261 (number.i 和 number.half 共用一块地址空间)
18. 关联、聚合 (Aggregation) 以及组合 (Composition) 的区别?
class A {...} class B { A* a; .....}
而组合表示 contains-a 的关系,关联性强于聚合:组合类与被组合类有相同的生命周期,组合类要对被组合类负责,采用实心的菱形表示组合关系:实现的形式是 :
class A{...} class B{ A a; ...}
参考文章: http://www.cnitblog.com/Lily/archive/2006/02/23/6860.html
http://www.vckbase.com/document/viewdoc/?id=422
19. 面向对象的三个基本特征,并简单叙述之?
1. 封装:将客观事物抽象成类,每个类对自身的数据和方法实行 protection(private, protected,public)
3. 多态:是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
20. 重载( overload) 和重写 (overried ,有的书也叫做 “ 覆盖 ” )的区别?
重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
21. 多态的作用?
1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;
2. 接口重用:为了类在继承和派生的时候 ,保证使用家族中任一类的实例的某一属性时的正确调用 。
22.Ado 与 Ado.net 的相同与不同?
23.New delete 与 malloc free 的联系与区别 ?
24.#define DOUBLE(x) x+x , i = 5*DOUBLE(5) ; i 是多少?
25. 有哪几种情况只能用 intialization list 而不能用 assignment?
答案:当类中含有 const 、 reference 成员变量;基类的构造函数都需要初始化表。
26. C++ 是不是类型安全的?
答案:不是。两个不同类型的指针之间可以强制转换(用 reinterpret cast) 。 C# 是类型安全的。
27. main 函数执行以前,还会执行什么代码?
28. 描述内存分配方式以及它们的区别 ?
29.struct 和 class 的区别
30. 当一个类 A 中没有任何成员变量与成员函数 , 这时 sizeof(A) 的值是多少?
31. 在 8086 汇编下,逻辑地址和物理地址是怎样转换的?( Intel )
答案:通用寄存器给出的地址,是段内偏移地址,相应段寄存器地址 *10H+ 通用寄存器内地址,就得到了真正要访问的地址。
32. 比较 C++ 中的 4 种类型转换方式?
33. 分别写出 BOOL,int,float, 指针类型的变量 a 与“零”的比较语句。
34. 请说出 const 与 #define 相比,有何优点?
Const 作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被 Const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
35. 简述数组与指针的区别?
36. 类成员函数的重载、覆盖和隐藏区别?
37. 求出两个数中的较大这
答案: ( ( a + b ) + abs( a - b ) ) / 2
38. 如何打印出当前源文件的文件名以及源文件的当前行号?
答案:
cout << __FILE__ ;
cout<<__LINE__ ;
__FILE__ 和 __LINE__ 是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。
39. main 主函数执行完毕后,是否可能会再执行一段代码,给出说明?
40. 如何判断一段程序是由 C 编译程序还是由 C++ 编译程序编译的?
答案:
#ifdef __cplusplus
cout<<"c++";
#else
cout<<"c";
#endif
41. 文件中有一组整数,要求排序后输出到另一个文件中
42. 链表题:一个链表的结点结构
struct Node
{
int data ;
Node *next ;
};
typedef struct Node Node ;
(1) 已知链表的头结点 head, 写一个函数把这个链表逆序 ( Intel)
43. 写一个函数找出一个整数数组中,第二大的数 ( microsoft )
44. 写一个在一个字符串 (n) 中寻找一个子串 (m) 第一个位置的函数。
KMP 算法效率最好,时间复杂度是O (n+m), 详见: http://www.zhanglihai.com/blog/c_335_kmp.html
46. 多重继承的内存分配问题:
47. 如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针)
48. 指针找错题
49. 如果编写一个标准 strcpy 函数
}
试题 7 存在与试题 6 同样的问题,在执行
char *str = (char *) malloc(100);
后未进行内存是否申请成功的判断 ; 另外,在 free(str) 后未置 str 为空,导致可能变成一个 “ 野 ” 指针,应加上:
str = NULL;
试题 6 的 Test 函数中也未对 malloc 的内存进行释放。
剖析:
试题 4 ~ 7 考查面试者对内存操作的理解程度,基本功扎实的面试者一般都能正确的回答其中 50~60 的错误。但是要完全解答正确,却也绝非易事。
50.String 的具体实现
class String
{
public:
String(const char *str = NULL); // 通用构造函数
String(const String &another); // 拷贝构造函数
~ String(); // 析构函数
String & operater =(const String &rhs); // 赋值函数
private:
char *m_data; // 用于保存字符串
};
尝试写出类的成员函数实现。
答案:
String::String(const char *str)
{
if ( str == NULL ) //strlen 在参数为 NULL 时会抛异常才会有这步判断
{
m_data = new char[1] ;
m_data[0] = '/0' ;
}
else
{
m_data = new char[strlen(str) + 1];
strcpy(m_data,str);
}
}
String::String(const String &another)
{
m_data = new char[strlen(another.m_data) + 1];
strcpy(m_data,other.m_data);
}
String& String::operator =(const String &rhs)
{
if ( this == &rhs)
return *this ;
delete []m_data; // 删除原来的数据,新开一块内存
m_data = new char[strlen(rhs.m_data) + 1];
strcpy(m_data,rhs.m_data);
return *this ;
}
String::~String()
{
delete []m_data ;
}
51.h 头文件中的 ifndef/define/endif 的作用?
52. # i nclude<file.h> 与 # i nclude "file.h" 的区别?
答:前者是从 Standard Library 的路径寻找和引用 file.h ,而后者是从当前工作路径搜寻并引用 file.h 。
53. 在 C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C” ?
C++ 语言支持函数重载, C 语言不支持函数重载。 C++ 提供了 C 连接交换指定符号 extern “C”
首先,作为 extern 是 C/C++ 语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。
通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字 extern 声明。例如,如果模块 B 欲引用该模块 A 中定义的全局变量和函数时只需包含模块 A 的头文件即可。这样,模块 B 中调用模块 A 中的函数时,在编译阶段,模块 B 虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块 A 编译生成的目标代码中找到此函数
extern "C" 是连接申明 (linkage declaration), 被 extern "C" 修饰的变量和函数是按照 C 语言方式编译和连接的 , 来看看 C++ 中对类似 C 的函数是怎样编译的:
作为一种面向对象的语言, C++ 支持函数重载,而过程式语言 C 则不支持。函数被 C++ 编译后在符号库中的名字与 C 语言的不同。例如,假设某个函数的原型为:
void foo( int x, int y );
该函数被 C 编译器编译后在符号库中的名字为 _foo ,而 C++ 编译器则会产生像 _foo_int_int 之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为 “mangled name” )。
_foo_int_int 这样的名字包含了函数名、函数参数数量及类型信息, C++ 就是靠这种机制来实现函数重载的。例如,在 C++ 中,函数 void foo( int x, int y ) 与 void foo( int x, float y ) 编译生成的符号是不相同的,后者为 _foo_int_float 。
同样地, C++ 中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以 "." 来区分。而本质上,编译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。
未加 extern "C" 声明时的连接方式
假设在 C++ 中,模块 A 的头文件如下:
// 模块 A 头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif
在模块 B 中引用该函数:
// 模块 B 实现文件 moduleB.cpp
# i nclude "moduleA.h"
foo(2,3);
加 extern "C" 声明后,模块 A 的头文件变为:
// 模块 A 头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x, int y );
#endif
在模块 B 的实现文件中仍然调用 foo( 2,3 ) ,其结果是:
( 1 )模块 A 编译生成 foo 的目标代码时,没有对其名字进行特殊处理,采用了 C 语言的方式;
( 2 )连接器在为模块 B 的目标代码寻找 foo(2,3) 调用时,寻找的是未经修改的符号名 _foo 。
如果在模块 A 中函数声明了 foo 为 extern "C" 类型,而模块 B 中包含的是 extern int foo( int x, int y ) ,则模块 B 找不到模块 A 中的函数;反之亦然。
所以,可以用一句话概括 extern “C” 这个声明的真实目的(任何语言中的任何语法特性的诞生都不是随意而为的,来源于真实世界的需求驱动。我们在思考问题时,不能只停留在这个语言是怎么做的,还要问一问它为什么要这么做,动机是什么,这样我们可以更深入地理解许多问题):实现 C++ 与 C 及其它语言的混合编程。
明白了 C++ 中 extern "C" 的设立动机,我们下面来具体分析 extern "C" 通常的使用技巧:
extern "C" 的惯用法
( 1 )在 C++ 中引用 C 语言中的函数和变量,在包含 C 语言头文件(假设为 cExample.h )时,需进行下列处理:
extern "C"
{
# i nclude "cExample.h"
}
而在 C 语言的头文件中,对其外部函数只能指定为 extern 类型, C 语言中不支持 extern "C" 声明,在 .c 文件中包含了 extern "C" 时会出现编译语法错误。
C++ 引用 C 函数例子工程中包含的三个文件的源代码如下:
/* c 语言头文件: cExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif
/* c 语言实现文件: cExample.c */
# i nclude "cExample.h"
int add( int x, int y )
{
return x + y;
}
// c++ 实现文件,调用 add : cppFile.cpp
extern "C"
{
# i nclude "cExample.h"
}
int main(int argc, char* argv[])
{
add(2,3);
return 0;
}
如果 C++ 调用一个 C 语言编写的 .DLL 时,当包括 .DLL 的头文件或声明接口函数时,应加 extern "C" { } 。
( 2 )在 C 中引用 C++ 语言中的函数和变量时, C++ 的头文件需添加 extern "C" ,但是在 C 语言中不能直接引用声明了 extern "C" 的该头文件,应该仅将 C 文件中将 C++ 中定义的 extern "C" 函数声明为 extern 类型。
C 引用 C++ 函数例子工程中包含的三个文件的源代码如下:
//C++ 头文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif
//C++ 实现文件 cppExample.cpp
# i nclude "cppExample.h"
int add( int x, int y )
{
return x + y;
}
/* C 实现文件 cFile.c
/* 这样会编译出错:# i nclude "cExample.h" */
int main( int argc, char* argv[] )
{
add( 2, 3 );
return 0;
}
15 题目的解答请参考《 C++ 中 extern “C” 含义深层探索》注解:
1.
What is displayed when f() is called given the code:
class Number {
public:
string type;
Number(): type( “ void ” ) { }
explicit Number(short) : type( “ short ” ) { }
Number(int) : type( “ int ” ) { }
};
void Show(const Number& n) { cout << n.type; }
void f()
{
short s = 42;
Show(s);
}
a) void
b) short
c) int
d) None of the above
2. Which is the correct output for the following code
double dArray[2] = {4, 8}, *p, *q;
p = &dArray[0];
q = p + 1;
cout << q – p << endl;
cout << (int)q - (int)p << endl;
a) 1 and 8
b) 8 and 4
c) 4 and 8
d) 8 and 1
第一个选 C ;
虽然传入的是 short 类型,但是 short 类型的构造函数被生命被 explicit ,也就是只能显示类型转换,不能使用隐式类型转换。
第二个选 A ;
第一个是指针加减,按照的是指向地址类型的加减,只跟类型位置有关, q 和 p 指向的数据类型以实际数据类型来算差一个位置,因此是 1 。而第二个加减是实际指针值得加减,在内存中一个 double 类型占据 8 个字节,因此是 8
54.Sony 笔试题
if(root==NULL)
{
root=NewNode;
return;
}
else
{
TNode* temp;
temp=root;
while((N>=temp.value && temp.left!=NULL) || (N !=NULL
))
{
while(N>=temp.value && temp.left!=NULL)
temp=temp.left;
while(N temp=temp.right;
}
if(N>=temp.value)
temp.left=NewNode;
else
temp.right=NewNode;
return;
}
}
※ 来源 : ·哈工大紫丁香 http://bbs.hit.edu.cn · [FROM:219.217.233.47]
────────────────────────────────────────
mengfd (Icebreaker) 于 (Sun Oct 23 14:59:59 2005) 说道 :
55 请你分别画出 OSI 的七层网络结构图和 TCP/IP 的五层结构图。
会话层:负责维护两个结点间会话连接的建立、管理和终止,以及数据交换
传输层:向用户提供可靠的端到端服务。 UDP TCP 协议。
网络层:通过路由选择算法为分组通过通信子网选择最适当的路径,以及实现拥塞控制、网络互联等功能。数据传输单元是分组。 IP 地址,路由器, IP 协议。
数据链路层:在物理层提供的服务基础上,数据链路层在通信的实体间建立数据链路连接,传输一帧为单位的数据包(,并采用差错控制与流量控制方法,使有差错的物理线路变成无差错的数据链路。)
56 请你详细地解释一下 IP 协议的定义,在哪个层上面?主要有什么作用? TCP 与 UDP 呢 ?
57. 请问交换机和路由器各自的实现原理是什么?分别在哪个层次上面实现的?
58. 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的 ?
59.8086 是多少位的系统?在数据总线上是怎么实现的?
8086 微处理器共有 4 个 16 位的段寄存器,在寻址内存单元时,用它们直接或间接地存放段地址。
数据段寄存器 DS :存放当前执行的程序所用操作数的段地址。
附加段寄存器 ES :存放当前执行程序中一个辅助数据段的段地址。
由 cs:ip 构成指令地址, ss:sp 构成堆栈的栈顶地址指针。 DS 和 ES 用作数据段和附加段的段地址(段起始地址或段值)
1. 地址线(码)与寻址范围: N 条地址线 寻址范围 =2N
2.8086 有 20 地址线 寻址范围为 1MB 由 00000H ~ FFFFFH
3. 8086 微处理器是一个 16 位结构,用户可用的寄存器均为 16 位:寻址 64KB
5. 段内的某个存储单元相对于该段段首地址的差值,称为段内偏移地址 ( 也叫偏移量 ) 用 16 位二进制代码表示。
6. 物理地址是由 8086 / 8088 芯片地址引线送出的 20 位地址码,它用来参加存储器的地址译码,最终读/写所访问的一个特定的存储单元。
7. 逻辑地址由某段的段地址和段内偏移地址 ( 也叫偏移量 ) 两部分所组成。写成:
段地址:偏移地址 ( 例如, 1234H : 0088H) 。
8. 在硬件上起作用的是物理地址,物理地址=段基地址 ×10H 十偏移地址
联想笔试题
1 .设计函数 int atoi(char *s) 。
2 . int i=(j=4,k=8,l=16,m=32); printf( “ %d ” , i); 输出是多少?
60. 解释局部变量、全局变量和静态变量的含义。
61. 论述含参数的宏与函数的优缺点。
普天 C++ 笔试题
1 .实现双向链表删除一个节点 P ,在节点 P 后插入一个节点,写出这两个函数。
2 .写一个函数,将其中的 /t 都转换成 4 个空格。
61.Windows 程序的入口是哪里?写出 Windows 消息机制的流程。
62.C++ 里面是不是所有的动作都是 main() 引起的?如果不是,请举例。
※ 来源 : ·哈工大紫丁香 http://bbs.hit.edu.cn · [FROM:219.217.233.47]
────────────────────────────────────────
mengfd (Icebreaker) 于 (Sun Oct 23 15:00:14 2005) 说道 :
大唐电信
DTT 笔试题
考试时间一小时,第一部分是填空和选择:
1 .数列 6 , 10 , 18 , 32 ,“?”,问“?”是几?
2 .某人出 70 买进一个 x , 80 卖出, 90 买回, 100 卖出,这桩买卖怎么样?
3 .月球绕地球一圈,至少要多少时间?
4 . 7 个人用 7 小时挖了 7 米 的沟,以同样的速度在 50 小时挖 50 米 的沟要多少人?
5 .鱼头长 9 ,鱼尾等于鱼头加半个鱼身,鱼身等于鱼头加鱼尾,问鱼全长多少?
6 .一个小姐买了一块手表,回家发现手表比她家的表慢了两分钟,晚上看新闻的时候
又发现她家的表比新闻里的时间慢了两分钟,则 。
A 手表和新闻里的时间一样
B 手表比新闻里的时间慢
C 手表比新闻里的时间快
7 .王先生看到一则招聘启事,发现两个公司除了以下条件不同外,其他条件都相同
A 半年年薪 50 万,每半年涨 5 万
B 一年年薪 100 万,每一年涨 20 万
王先生想去一家待遇比较优厚的公司,他会去哪家?
10 .问哪个袋子里有金子?
A 袋子上的标签是这样写的: B 袋子上的话是对的,金子在 A 袋子。
B 袋子上的标签是这样写的: A 袋子上的话是错的,金子在 A 袋子里。
11 . 3 个人住酒店 30 块钱,经理找回 5 块钱,服务生从中藏了 2 块钱,找给每人 1 块钱,
3 ×( 101 ) +2=29 ,问这是怎么回事?
12 .三篇写作,均为书信形式。
( 1 )一片中文的祝贺信,祝贺某男当了某公司 xx
( 2 )两篇英文的,一是说有事不能应邀,派别人去;另一篇是讨债的, 7 天不给钱就
走人(主要考 business letter 格式)。
大唐面试试题
1 .什么是中断?中断发生时 CPU 做什么工作?
2 . CPU 在上电后,进入操作系统的 main() 之前必须做什么工作?
3 .简述 ISO OSI 的物理层 Layer1 ,链路层 Layer2 ,网络层 Layer3 的任务。
4 .有线电话和无线电话有何区别?无线电话特别需要注意的是什么?
63. 软件开发五个主要 step 是什么?
※ 来源 : ·哈工大紫丁香 http://bbs.hit.edu.cn · [FROM:219.217.233.47]
────────────────────────────────────────
mengfd (Icebreaker) 于 (Sun Oct 23 15:01:22 2005) 说道 :
网通笔试题
选择题(每题 5 分,只有一个正确答案)
1 .中国 1 号信令协议属于 的协议。
A ccs B cas C ip D atm
2 . isdnpri 协议全称是 。
A 综合业务模拟网基速协议
B 综合业务模拟网模拟协议
C 综合业务数字网基率协议
D 综合业务数字网基次协议
3 .路由协议中, 协议是用距离作为向量的。
A ospf B bgp C is-is D rip
4 .中国智能网中, ssp 与 scp 间最上层的 ss7 协议是 。
A incs B is41b C is41c D inap
5 . dtmf 全称是 。
A 双音多频 B 多音双频 C 多音三频 D 三音多频
6 .计算机的基本组成部分中,不包含下面设备的是 。
A cpu B 输入设备 C 存储器 D 接口
7 .脉冲编码调制的简称是 。
A pcm B pam C (delta)M D atm
8 .普通电话线接口专业称呼是 。
A rj11 B rj45 C rs232 D bnc
9 .现有的公共数据网都采用 。
A 电路交换技术 B 报文交换技术
C 语音插空 D 分组交换
10 . ss7 协议中的制止市忙消息简写为 。
A stb B slb C sub D spb
简答题(每题 10 分)
1 .简述普通电话与 IP 电话的区别。
2 .简述随路信令与公路信令的根本区别。
3 .说明掩码的主要作用。
4 . ss7 协议中,有三大要素决定其具体定位,哪三大要素?
5 .描述 ss7 的基本通话过程。
6 .简述通信网的组成结构。
7 .面向连接与面向非连接各有何利弊?
8 .写出爱尔兰的基本计算公式。
9 .数据网主要有哪些设备?
10 .中国一号协议是如何在被叫号码中插入主叫号码的?
东信笔试题目
笔试: 30 分钟。
1 .压控振荡器的英文缩写。
2 .动态随机存储器的英文缩写。
3 .选择电阻时要考虑什么?
4 .单片机上电后没有运转,首先要检查什么?
5 .计算机的基本组成部分及其各自的作用。
6 .怎样用 D 触发器、与或非门组成二分频电路?
64.static 有什么用途?(请至少说明两种)
65. 引用与指针有什么区别?
66. 描述实时系统的基本特性
67. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
68. 什么是平衡二叉树?
答 、左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于 1 。
69. 堆栈溢出一般是由什么原因导致的?
70. 什么函数不能声明为虚函数?
71. 冒泡排序算法的时间复杂度是什么?
72. 写出 float x 与“零值”比较的 if 语句。
答 、 if(x>0.000001&&x<-0.000001)
73.Internet 采用哪种网络协议?该协议的主要层次结构?
答 、 tcp/ip 应用层 / 传输层 / 网络层 / 数据链路层 / 物理层
74.Internet 物理地址和 IP 地址转换采用什么协议?
答 、 ARP (Address Resolution Protocol) (地址解析协议)
75.IP 地址的编码分为哪俩部分?
答 、 IP 地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与之后才能区分哪些是网络位哪些是主机位。
76. 用户输入 M,N 值,从 1 至 N 开始顺序循环数数,每数到 M 输出该数值,直至全部输出。写出 C 程序。
77. 不能做 switch() 的参数类型是:
78. 局部变量能否和全局变量重名?
79. 如何引用一个已经定义过的全局变量?
80. 全局变量可不可以定义在可被多个 .C 文件包含的头文件中?为什么?
答 、可以,在不同的 C 文件中以 static 形式来声明同名全局变量。
可以在不同的 C 文件中声明同名的全局变量,前提是其中只能有一个 C 文件中对此变量赋初值,此时连接不会出错
81. 语句 for( ; 1 ; ) 有什么问题?它是什么意思?
82.do …… while 和 while …… do 有什么区别?
83. 请写出下列代码的输出内容
printf("b , c , d : %d , %d , %d" , b , c , d ) ;
84.statac 全局变量、局部变量、函数与普通全局变量、局部变量、函数
static 全局变量与普通的全局变量有什么区别? static 局部变量和普通局部变量有什么区别? static 函数与普通函数有什么区别?
从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
static 全局变量与普通的全局变量有什么区别: static 全局变量只初使化一次,防止在其他文件单元中被引用 ;
static 局部变量和普通局部变量有什么区别: static 局部变量只被初始化一次,下一次依据上一次结果值;
static 函数与普通函数有什么区别: static 函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。
85. 设有以下说明和定义:
typedef union {long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
则语句 printf("%d",sizeof(struct date)+sizeof(max)); 的执行结果是?
答 、结果是: ___52____ 。 DATE 是一个 union, 变量公用空间 . 里面最大的变量类型是 int[5], 占用 20 个字节 . 所以它的大小是 20
data 是一个 struct, 每个变量分开占用空间 . 依次为 int4 + DATE20 + double8 = 32.
当然 ... 在某些 16 位编辑器下 , int 可能是 2 字节 , 那么结果是 int2 + DATE10 + double8 = 20
86.-1,2,7,28,,126 请问 28 和 126 中间那个数是什么?为什么?
87. 用两个栈实现一个队列的功能?要求给出算法和思路!
(2) 如果不为空,则将栈 A 中所有元素依次 pop 出并 push 到栈 B ;
这样实现的队列入队和出队的平摊复杂度都还是 O(1), 比上面的几种方法要好。
88. 在 c 语言库函数中将一个字符转换成整型的函数是 atool() 吗,这个函数的原型是什么?
用 法 : long atol(const char *nptr);
printf("string = %s integer = %ld/n", str, l);
89. 对于一个频繁使用的短小函数 , 在 C 语言中应用什么实现 , 在 C++ 中应用什么实现 ?
90. 用预处理指令 #define 声明一个常数,用以表明 1 年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3). 意识到这个表达式将使一个 16 位机的整型数溢出 - 因此要用到长整型符号 L, 告诉编译器这个常数是的长整型数。
4). 如果你在你的表达式中用到 UL (表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。
91. 写一个“标准”宏 MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) (A) : (B))
1). 标识 #define 在宏中应用的基本知识。这是很重要的,因为直到嵌入 (inline) 操作符变为标准 C 的一部分,宏是方便产生嵌入代码的唯一方法,
对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
2). 三重条件操作符的知识。这个操作符存在 C 语言中的原因是它使得编译器能产生比 if-then-else 更优化的代码,了解这个用法是很重要的。
4). 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?
92. 预处理器标识 #error 的目的是什么?
如果你不知道答案,请看参考文献 1 。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读 C 语言课本的附录去找出象这种
问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。
93. 嵌入式系统中经常要用到无限循环,你怎么样用 C 编写死循环呢?
这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的
基本原理。如果他们的基本答案是:“我被教着这样做,但从没有想到过为什么。”这会给我留下一个坏印象。
应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的 BASIC/FORTRAN 程序员。
94. 用变量 a 给出下面的定义
b) 一个指向整型数的指针( A pointer to an integer )
c) 一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an integer )
d) 一个有 10 个整型数的数组( An array of 10 integers )
e) 一个有 10 个指针的数组,该指针是指向一个整型数的( An array of 10 pointers to integers )
f) 一个指向有 10 个整型数数组的指针( A pointer to an array of 10 integers )
argument and return an integer )
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。
但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。因为在被面试的这段时间里,我确定我知道这个问题的答案。应试者如果不知道
所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?
95. 关键字 static 的作用是什么?
这个简单的问题很少有人能回答完全。在 C 语言中,关键字 static 有三个明显的作用:
1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数
96. 关键字 const 是什么含意?
2). 通过给优化器一些附加的信息,使用关键字 const 也许能产生更紧凑的代码。
3). 合理地使用关键字 const 可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少 bug 的出现。
97. 关键字 volatile 有什么含意 并给出三个不同的例子。
2). 一个中断服务子程序中会访问到的非自动变量 (Non-automatic variables)
假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得 volatile 完全的重要性。
1). 一个参数既可以是 const 还可以是 volatile 吗?解释为什么。
1). 是的。一个例子是只读的状态寄存器。它是 volatile 因为它可能被意想不到地改变。它是 const 因为程序不应该试图去修改它。
2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个 buffer 的指针时。
3). 这段代码的有个恶作剧。这段代码的目的是用来返指针 *ptr 指向值的平方,但是,由于 *ptr 指向一个 volatile 型参数,编译器将产生类似下面的代码:
由于 *ptr 的值可能被意想不到地该变,因此 a 和 b 可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
98. 下面的代码输出是什么,为什么?
(a+b > 6) puts("> 6") : puts("<= 6");
99.C 语言同意一些令人震惊的结构 , 下面的结构是合法的吗,如果是它做些什么?
因此 , 这段代码持行后 a = 6, b = 7, c = 12 。
如果你知道答案,或猜出正确答案,做得好。如果你不知道答案,我也不把这个当作问题。我发现这个问题的最大好处是 : 这是一个关于代码编写风格,代码的可读性,代码的可修改性的好的话题
100. 线形表 a 、 b 为两个有序升序的线形表,编写一程序,使两个有序线形表合并成一个有序升序线形表 h ;
答案在 请化大学 严锐敏《数据结构第二版》第二章例题,数据结构当中,这个叫做:两路归并排序
Linklist *unio(Linklist *p,Linklist *q){
while(pa->next!=NULL&&qa->next!=NULL){
101. 用递归算法判断数组 a[N] 是否为一个递增数组。
递归的方法,记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回 false 结束:
return fun( a,n-1) && ( a[n-1] >= a[n-2] );
102. 编写算法,从 10 亿个浮点数当中,选出其中最大的 10000 个。
用外部排序,在《数据结构》书上有《计算方法导论》在找到第 n 大的数的算法上加工
103. 编写一 unix 程序,防止僵尸进程的出现 .
同学的 4 道面试题,应聘的职位是搜索引擎工程师,后两道超级难,(希望大家多给一些算发)
1. 给两个数组和他们的大小,还有一动态开辟的内存,求交集,把交集放到动态内存 dongtai ,并且返回交集个数
long jiaoji(long* a[],long b[],long* alength,long blength,long* dongtai[])
2. 单连表的建立,把 'a'--'z'26 个字母插入到连表中,并且倒叙,还要打印!
node *head = (node*)malloc(sizeof(node));
head->data = ' ';head->next=NULL;
node *first = (node*)malloc(sizeof(node));
first->data = 'a';first->next=NULL;head->next = first;
node *temp = (node*)malloc(sizeof(node));
temp->data = 'b'+i;temp->next=NULL;q=temp;
head->next = temp; temp->next=p;p=q;
104. 可怕的题目终于来了
象搜索的输入信息是一个字符串,统计 300 万输入信息中的最热门的前十条,我们每次输入的一个字符串为不超过 255byte, 内存使用只有 1G ,
7. 国内的一些帖吧,如 baidu, 有几十万个主题,假设每一个主题都有上亿的跟帖子,怎么样设计这个系统速度最好,请描述思想,写出算发( c 语言),空间和时间复杂度,
dest=(char *)malloc(strlen(src));
dest=(char *)malloc(sizeof(char)*(strlen(src)+1));
105. 判断字符串是否为回文
bool IsSymmetry(const char * p)
{
assert(p!=NULL);
const char * q=p;
int len=0;
while (*q++!='/0' )
{
len++;
}
bool bSign=true ;
q=p+len-1;
if (0<len)
{
for (int i=0;i<len/2;i++)
{
if (*p++!=*q--){ bSign=false ;break ;};
}
}
if (bSign==true )
{
printf("Yes!/n" );
}
else
{
printf("No!/n" );
}
return bSign;
}
107.ASDL 使用的是什么协议?并进行简单描述?
108.Static 作用是什么
首先 static 的最主要功能是隐藏,其次因为 static 变量存放在静态存储区,所以它具备持久性和默认值 0 。
109. 什么是预编译 , 何时需要预编译 ?
预编译又称为预处理 , 是做些代码文本的替换工作。处理 # 开头的指令 , 比如拷贝 #include 包含的文件代码, #define 宏定义的替换 , 条件编译等,就是为编译做的预备工作的阶段,主要处理 # 开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。
c 编译系统在对程序进行通常的编译之前,先进行预处理。 c 提供的预处理功能主要有以下三种: 1 )宏定义 2 )文件包含 3 )条件编译
1、总是使用不经常改动的大型代码体。
2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。
110. 进程和线程的区别
什么是进程( Process ):普通的解释就是,进程是程序的一次执行,而什么是线程( Thread ),线程可以理解为进程中的执行的一段程序片段。在一个多任务环境中下面的概念可以帮助我们理解两者间的差别:
进程间是独立的,这表现在内存空间,上下文环境;线程运行在进程空间内。 一般来讲(不使用特殊技术)进程是无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内,所以同一进程所产生的线程共享同一内存空间。 同一进程中的两段代码不能够同时执行,除非引入线程。线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。线程占用的资源要少于进程所占用的资源。 进程和线程都可以有优先级。在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。
线程是指进程内的一个执行单元 , 也是进程内的可调度实体 . 与进程的区别 :
(1) 地址空间 : 进程内的一个执行单元 ; 进程至少有一个线程 ; 它们共享进程的地址空间 ; 而进程有自己独立的地址空间 ;
(2) 进程是资源分配和拥有的单位 , 同一个进程内的线程共享进程的资源
(3) 线程是处理器调度的基本单位 , 但进程不是 .
(4) 二者均可并发执行 .
111. 插入排序和
插入排序基本思想:(假定从大到小排序)依次从后面拿一个数和前面已经排好序的数进行比较,比较的过程是从已经排好序的数中最后一个数开始比较,如果比这个数,继续往前面比较,直到找到比它大的数,然后就放在它的后面,如果一直没有找到,肯定这个数已经比较到了第一个数,那就放到第一个数的前面。那么一般情况下,对于采用插入排序法去排序的一组数,可以先选 取第一个数做为已经排好序的一组数。然后把第二个放到正确位置。
选择排序 (Selection Sort) 是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素 , 存放到排序序列的起始位置 , 然后 , 再从剩余未排序元素中继续寻找最小元素 , 然后放到排序序列末尾。以此类推 , 直到所有元素均排序完毕。
112. 运算符优先级问题
能正确表示 a 和 b 同时为正或同时为负的逻辑表达式是 (D ) 。
sssA 、 (a>=0||b>=0) && (a<0||b<0)
B 、 (a>=0 && b>=0)&&(a<0& & b<0)
C 、 (a+b>0) && (a+b<=0)
D 、 a*b>0
以下关于运算符优先顺序的描述中正确的是 (C) 。
A 、关系运算符 < 算术运算符 < 赋值运算符 < 逻辑与运算符
B 、逻辑与运算符 < 关系运算符 < 算术运算符 < 赋值运算符
C 、赋值运算符 < 逻辑与运算符 < 关系运算符 < 算术运算符
D 、算术运算符 < 关系运算符 < 赋值运算符 < 逻辑与运算符
113. 字符串倒序
写一个函数将 "tom is cat" 倒序打印出来,即 "cat is tom"
//a.ch
#define SPACE ' '
#define ENDL '/0'
char* str = "Tom is cat"; // 字符串
char* p1 = str+strlen(str)-1;
char* p2 = p1; // 开始时, p1,p2 都指向字符串结尾处
char t=0; // 临时变量,用来保存被临时替换为 ENDL 的字符
while(str!=p1--)
{
if(SPACE!=*p1){
for(p2=p1+1;SPACE!=*p1; p1--, t=*p2, *p2=ENDL);
// p1+1 指向单词的第一个字母 ,p2 指向单词的结尾 , 此时输出这个单词
printf("%s ",p1+1);
*p2=t;
p2=p1;
}
}
Output:
cat is Tom
----------------------------------------------------------------------
1) 写一个递归函数将内存中的字符串翻转 "abc"->"cba"
2) 写一个函数将 "tom is cat" 将内存中的字符串翻转,即 "cat is tomm"
#include <stdio.h>
#define SPACE ' '
#define ENDL '/0'
char* s = "The quick brown fox jumps over the lazy dog";
void str_reverse(char* p1,char* p2){
if(p1==p2)return;
*p1 = (*p1)+(*p2);
*p2 = (*p1)-(*p2);
*p1 = (*p1)-(*p2);
if(p1==p2-1)return;
else str_reverse(++p1,--p2);
}
void str_word_reverse(char* str){
char *q1=str, *q2=str, *t;
while(*q1==SPACE)q1++;
if(*q1==ENDL)return; //!
else q2=q1+1;
while( (*q2!=SPACE) && (*q2!=ENDL) )q2++;
t=q2--;
str_reverse(q1,q2);
if(*t==ENDL)return;
else str_word_reverse(t);
}
int
main(int a ,char** b)
{
printf("%s/n",s);
str_reverse(s,s+strlen(s)-1);
printf("%s/n",s);
str_word_reverse(s);
printf("%s/n",s);
return 0;
}
Output:
The quick brown fox jumps over the lazy dog
god yzal eht revo spmuj xof nworb kciuq ehT
dog lazy the over jumps fox brown quick The
----------------------------------------------------------------------
今天同学又问一道题 , 和上面有些类似,但是要求更严格了一些:
写一个递归函数将内存中的字符串翻转 "abc"->"cba", 并且函数原型已确定: void reverse(char* p)
其实,要求越多,思路越确定,我的解如下:
#include <stdio.h>
#include <string.h>
char* s = "0123456789";
#define ENDL '/0'
void reverse(char* p){
// 这是这种方法的关键,使用 static 为的是能用 str_reverse 的思路,但是不好
static char* x=0;
if(x==0)x=p;
char* q = x+strlen(p)-1;
if(p==q)return;
*q=(*p)^(*q);
*p=(*p)^(*q);
*q =(*p)^(*q);
if(q==p+1)return;
reverse(++p);
}
// 这种方法就直观多了,但是当字符串很长的时候就很低效
void reverse2(char* p){
if(*(p+1)==ENDL)return;
for(char* o=p+strlen(p)-1,char t=*o;o!=p;o--)
*o=*(o-1);
*p=t;
reverse2(p+1);
}
int main(int c,char** argv){
reverse2(s);
printf("%s/n",s);
return 0;
}
114. 交换两个数的宏定义
交换两个参数值的 宏定义 为: . #define SWAP (a,b) (a)=(a)+(b);(b)=(a)-(b);(a)=(a)-(b);
115.Itearator 各指针的区别
游标和指针
我说过游标是指针,但不仅仅是指针。游标和指针很像,功能很像指针,但是实际上,游标是通过重载一元的 ”*” 和 ”->” 来从容器中间接地返回一个值。将这些值存储在容器中并不是一个好主意,因为每当一个新值添加到容器中或者有一个值从容器中删除,这些值就会失效。在某种程度上,游标可以看作是句柄( handle )。通常情况下游标( iterator )的类型可以有所变化,这样容器也会有几种不同方式的转变:
iterator—— 对于除了 vector 以外的其他任何容器,你可以通过这种游标在一次操作中在容器中朝向前的方向走一步。这意味着对于这种游标你只能使用 “++” 操作符。而不能使用 “--” 或 “+=” 操作符。而对于 vector 这一种容器,你可以使用 “+=” 、 “—” 、 “++” 、 “-=” 中的任何一种操作符和 “<” 、 “<=” 、 “>” 、 “>=” 、 “==” 、 “!=” 等比较运算符。
116. C++ 中的 class 和 struct 的区别
从语法上,在 C++ 中(只讨论 C++ 中)。 class 和 struct 做类型定义时只有两点区别:
(一)默认继承权限。如果不明确指定,来自 class 的继承按照 private 继承处理,来自 struct 的继承按照 public 继承处理;
(二)成员的默认访问权限。 class 的成员默认是 private 权限, struct 默认是 public 权限。
除了这两点, class 和 struct 基本就是一个东西。语法上没有任何其它区别。
不能因为学过 C 就总觉得连 C++ 中 struct 和 class 都区别很大,下面列举的说明可能比较无聊,因为 struct 和 class 本来就是基本一样的东西,无需多说。但这些说明可能有助于澄清一些常见的关于 struct 和 class 的错误认识:
( 1 )都可以有成员函数;包括各类构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;
( 2 )都可以有一大堆 public/private/protected 修饰符在里边;
( 3 )虽然这种风格不再被提倡,但语法上二者都可以使用大括号的方式初始化:
A a = {1, 2, 3}; 不管 A 是个 struct 还是个 class ,前提是这个类 / 结构足够简单,比如所有的成员都是 public 的,所有的成员都是简单类型,没有显式声明的构造函数。
( 4 )都可以进行复杂的继承甚至多重继承,一个 struct 可以继承自一个 class ,反之亦可;一个 struct 可以同时继承 5 个 class 和 5 个 struct ,虽然这样做不太好。
( 5 )如果说 class 的设计需要注意 OO 的原则和风格,那么没任何理由说设计 struct 就不需要注意。
( 6 )再次说明,以上所有说法都是指在 C++ 语言中,至于在 C 里的情况, C 里是根本没有 “class” ,而 C 的 struct 从根本上也只是个包装数据的语法机制。
---------------------------------------------------------------
最后,作为语言的两个关键字,除去定义类型时有上述区别之外,另外还有一点点: “class” 这个关键字还用于定义模板参数,就像 “typename” 。但关键字 “struct” 不用于定义模板参数。
关于使用大括号初始化
class 和 struct 如果定义了构造函数的话,都不能用大括号进行初始化
如果没有定义构造函数, struct 可以用大括号初始化。
如果没有定义构造函数,且所有成员变量全是 public 的话,可以用大括号初始化。
关于默认访问权限
class 中默认的成员访问权限是 private 的,而 struct 中则是 public 的。
关于继承方式
class 继承默认是 private 继承,而 struct 继承默认是 public 继承。
关于模版
在模版中,类型参数前面可以使用 class 或 typename ,如果使用 struct ,则含义不同, struct 后面跟的是 “non-type template parameter” ,而 class 或 typename 后面跟的是类型参数。
class 中有个默认的 this 指针, struct 没有
不同点:构造函数,析构函数 this 指针
117. 有关重载函数
返回值类型不同构不成重载
参数参数顺序不同能构成重载
c++ 函数同名不同返回值不算重载!函数重载是忽略返回值类型的。
---------------------------------------------
成员函数被重载的特征有:
1) 相同的范围(在同一个类中);
2) 函数名字相同;
3) 参数不同;
4) virtual 关键字可有可无。
5) 成员函数中 有无 const ( 函数后面 ) 也可判断是否重载
118. 数据库与 T-SQL 语言
关系数据库是表的集合,它是由一个或多个关系模式定义。 SQL 语言中的数据定义功能包括对数据库、基本表、视图、索引的定义。
119. 关系模型的基本概念
关系数据库以关系模型为基础,它有以下三部分组成:
● 数据结构 —— 模型所操作的对象、类型的集合
● 完整性规则 —— 保证数据有效、正确的约束条件
● 数据操作 —— 对模型对象所允许执行的操作方式
关系( Relation )是一个由行和列组成的二维表格,表中的每一行是一条记录( Record ),每一列是记录的一个字段( Field )。表中的每一条记录必须是互斥的,字段的值必须具有原子性。
120.SQL 语言概述
SQL (结构化查询语言)是关系数据库语言的一种国际标准,它是一种非过程化的语言。通过编写 SQL ,我们可以实现对关系数据库的全部操作。
● 数据定义语言( DDL ) —— 建立和管理数据库对象
● 数据操纵语言( DML ) —— 用来查询与更新数据
● 数据控制语言( DCL ) —— 控制数据的安全性
起来是一个很简单的问题,每一个使用过 RDBMS 的人都会有一个概念。
事务处理系统的典型特点是具备 ACID 特征。 ACID 指的是 Atomic (原子的)、 Consistent (一致的)、 Isolated (隔离的)以及 Durable (持续的),它们代表着事务处理应该具备的四个特征:
原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分
一致性:在事务处理执行之前和之后,数据是一致的。
隔离性:一个事务处理对另一个事务处理没有影响。
持续性:当事务处理成功执行到结束的时候,其效果在数据库中被永久纪录下来。
121.C 语言中结构化程序设计的三种基本控制结构
顺序结构
选择结构
循环结构
122.CVS 是什么
cvs ( Concurrent Version System ) 是一个版本控制系统。使用它,可以记录下你的源文件的历史。
例如,修改软件时可能会不知不觉混进一些 bug ,而且可能过了很久你才会察觉到它们的存在。有了 cvs ,你可以很容易地恢复旧版本,并从中看出到底是哪个修改导致了这个 bug 。有时这是很有用的。
CVS 服务器端对每个文件维护着一个修订号 , 每次对文件的更新,都会使得文件的修订号加 1 。在客户端中也对每个文件维护着一个修订号 ,CVS 通过这两个修订号的关系,来进行 Update,Commit 和发现冲突等操作操作
123. 三种基本的数据模型
按照数据结构类型的不同,将数据模型划分为层次模型、网状模型和关系模型。
原博客地址:http://blog.csdn.net/lina_acm/article/details/51603061
转载于:https://www.cnblogs.com/liuyangofficial/p/7111509.html
C++笔试题目大全(笔试宝典)(转)相关推荐
- 中航一院c语言笔试题目,C笔试题目汇总
C笔试题目汇总 发布时间:2021-03-19 C语言描述问题比汇编语言迅速,工作量小.可读性好,易于调试.修改和移植,而代码质量与汇编语言相当.C语言一般只比汇编程序生成的目标代码效率低10%-20 ...
- C/C++笔试题目大全
1.以下程序的运行结果是() int main(void) {printf("%s , %5.3s\n","computer","computer&q ...
- java经典笔试题目_java笔试考题(经典).pdf
java笔试考题(经典) TCSD标准考试 JAVA试题 (100分制,考试时间150分钟) 一. 单选(30小题共60.0分) 1. 下列代码的运行结果是 public class TwoThrea ...
- linux运维笔试题目,linux运维相关的笔试题目_笔试题目
一.Linux系统和shell 1.写一个sed命令,修改/tmp/input.txt文件的内容,要求: ①删除所有空行: ②在非空行前面加一个"AAA",在行尾加一个" ...
- 久谦咨询python笔试题目_python笔试含答案
听过the zen of python 吗?尽可能地默写它,中英文皆可,大意也可.如果没有听过,谈谈你对pythonic 的看法,或者你认为什么样的python 代码才是好代码. The Zen of ...
- php简单选择题,PHP面试笔试题目选择题
导读:PHP是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域.以下是由小编J.L为您整理推荐的笔试题目和笔试经验,欢迎参考阅读. 1.以 ...
- C#与.NET程序员面试宝典 1.4.3 笔试(举例微软、雅虎笔试题目)
笔试主要考察应聘者掌握基础知识的扎实程度,以及解决问题的思考方式.笔试是程序员应聘过程中最关键的.也是难度最大的一个环节.在激烈的求职竞争中,想顺利漂亮地完成笔试题目.躲过面试官布下的种种" ...
- 百度 腾讯 阿里 小米 笔试题目宝典
九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题 引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾 ...
- 笔试题目“翻转字符串”的实现
笔试题目 //写一个函数,将字符串翻转,翻转方式如下:"I am a student"反转成"student a am I",不借助任何库函数. 据说这题在笔试 ...
- 100条经典C++笔试题目及答案分享
100条经典C++笔试题目分享 一.C++与C差异(1-17) 二.数据类型.关键字(18-37) 三.C++面向对象的特性(38-61) 四.程序阅读题(62-89) 五.编程练习(90-100) ...
最新文章
- 安装envi出现cannot find lincese_Ubuntu 16.04 安装 CUDA10.1 (解决循环登陆的问题)
- PriorityBlockingQueue用法
- 破解世界性技术难题! GTS让分布式事务简单高效
- 项目——迁移/home分区
- notepad设置中文
- opencv android jni,OpenCV - AndroidStudio的JNI工程及引用OpenCV
- Linux服务器系统备份还原
- grunt安装与运行
- Android 驱动(9)----设备树(一)linux内核主线了解dts
- win10计算机管理看不见蓝牙,win10系统蓝牙不见了的解决方法
- PHP - 如何处理文件名乱码
- 排序算法之一 冒泡排序(C++版本)
- 三维重建系列之COLMAP: Structure-from-Motion Revisited
- 巧用层次坐标解决统计图分类轴与系列取值
- Edge浏览器+百度翻译:识别图片类PDF中的文字并翻译
- 大智慧行情服务器在哪个文件夹,【大智慧】大智慧公式在哪个文件夹?
- SetupFactory安装前卸载旧版本
- 美通企业日报 | 阿迪达斯携手贝克汉姆推出新跑鞋;佛山照明与国星光电合作健康照明...
- 帝国cms模板-免费帝国CMS模板-帝国CMS模板安装详细教程
- NOI题库练习1.5(38)