{

SRM_no %= MAX_SRM;

if(MY_SRM.state==IDLE)

{

break;

}

}

if(I>=MAX_SRM)

return (NULL_SRM);

else

return SRM_no;

}

系统会初始化static int变量为0,但该值会一直保存,所谓的不可重入...

--------------------------------------------------------------------------

13.写出运行结果:

{// test1

char str[] = "world"; cout << sizeof(str)

<< ": ";

char *p    = str;     cout << sizeof(p)

<< ": ";

char i     = 10;      cout << sizeof(i)

<< ": ";

void *pp   = malloc(10);  cout <<

sizeof(p) << endl;

}

6:4:1:4

--------------------------------------------------------------------------

14.写出运行结果:

{// test2

union V {

struct X {

unsigned char s1:2;

unsigned char s2:3;

unsigned char s3:3;

} x;

unsigned char c;

} v;

v.c = 100;

printf("%d", v.x.s3);

}

3

--------------------------------------------------------------------------

15.用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数

A1:

16位的系统下,

int i = 65536;

cout << i; // 输出0;

int i = 65535;

cout << i; // 输出-1;

32位的系统下,

int i = 65536;

cout << i; // 输出65536;

int i = 65535;

cout << i; // 输出65535;

A2:

int a = ~0;

if( a>65536 )

{

cout<

}

else

{

cout<

}

--------------------------------------------------------------------------

16.C和C++有什么不同?

从机制上:c是面向过程的(但c也可以编写面向对象的程序);c++是面向对象的,提供了类。但是,

c++编写面向对象的程序比c容易

从适用的方向:c适合要求代码体积小的,效率高的场合,如嵌入式;c++适合更上层的,复杂的;

llinux核心大部分是c写的,因为它是系统软件,效率要求极高。

从名称上也可以看出,c++比c多了+,说明c++是c的超集;那为什么不叫c+而叫c++呢,是因为c++比

c来说扩充的东西太多了,所以就在c后面放上两个+;于是就成了c++

C语言是结构化编程语言,C++是面向对象编程语言。

C++侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。

--------------------------------------------------------------------------

17.在不用第三方参数的情况下,交换两个参数的值

#include

void main()

{

int i=60;

int j=50;

i=i+j;

j=i-j;

i=i-j;

printf("i=%d\n",i);

printf("j=%d\n",j);

}

方法二:

i^=j;

j^=i;

i^=j;

方法三:

// 用加减实现,而且不会溢出

a = a+b-(b=a)

--------------------------------------------------------------------------

18.有关位域的面试题(为什么输出的是一个奇怪的字符)

a.t = 'b';效果相当于 a.t= 'b' & 0xf;

'b' --> 01100010

'b' & 0xf -->>00000010

所以输出Ascii码为2的特殊字符

char t:4;就是4bit的字符变量,同样

unsigned short i:8;就是8bit的无符号短整形变量

--------------------------------------------------------------------------

19.int i=10, j=10, k=3; k*=i+j; k最后的值是?

60

--------------------------------------------------------------------------

20.进程间通信的方式有?

进程间通信的方式有共享内存, 管道 ,Socket ,消息队列 , DDE等

--------------------------------------------------------------------------

21.

struct A

{

char t:4;

char k:4;

unsigned short i:8;

unsigned long m;

}

sizeof(A)=?(不考虑边界对齐)

7

struct CELL             // Declare CELL bit

field

{

unsigned character  : 8;  // 00000000

????????

unsigned foreground : 3;  // 00000???

00000000

unsigned intensity  : 1;  // 0000?000

00000000

unsigned background : 3;  // 0???0000

00000000

unsigned blink      : 1;  // ?0000000

00000000

} screen[25][80];       // Array of bit fields

二、位结构

位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构

比按位运算符更加方便。

位结构定义的一般形式为:

struct位结构名{

数据类型 变量名: 整型常数;

数据类型 变量名: 整型常数;

} 位结构变量;

其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整

数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。

变量名是选择项, 可以不命名, 这样规定是为了排列需要。

例如: 下面定义了一个位结构。

struct{

unsigned incon: 8;

/*incon占用低字节的0~7共8位*/

unsigned txcolor:

4;/*txcolor占用高字节的0~3位共4位*/

unsigned bgcolor:

3;/*bgcolor占用高字节的4~6位共3位*/

unsigned blink: 1;  /*blink占用高字节的第7位*/

}ch;

位结构成员的访问与结构成员的访问相同。

例如: 访问上例位结构中的bgcolor成员可写成:

ch.bgcolor

注意:

1. 位结构中的成员可以定义为unsigned, 也可定义为signed,  但当成员长

度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。

2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,

如果是指针, 其成员访问方式同结构指针。

3. 位结构总长度(位数), 是各个位成员定义的位数之和,  可以超过两个字

节。

4. 位结构成员可以与其它结构成员一起使用。

例如:

struct info{

char name[8];

int age;

struct addr address;

float pay;

unsigned state: 1;

unsigned pay: 1;

}workers;

上例的结构定义了关于一个工人的信息。其中有两个位结构成员, 每个位结

构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工

人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。

--------------------------------------------------------------------------

22.下面的函数实现在一个固定的数上加上一个数,有什么错误,改正

int add_n(int n)

{

static int i=100;

i+=n;

return i;

}

答:

因为static使得i的值会保留上次的值。

去掉static就可了

--------------------------------------------------------------------------

23.下面的代码有什么问题?

class A

{

public:

A() { p=this; }

~A() { if(p!=NULL) { delete p; p=NULL; } }

A* p;

};

答:

会引起无限递归

--------------------------------------------------------------------------

24.

union a {

int a_int1;

double a_double;

int a_int2;

};

typedef struct

{

a a1;

char y;

} b;

class c

{

double c_double;

b b1;

a a2;

};

输出cout

VC6环境下得出的结果是32

另:

我(sun)在VC6.0+win2k下做过试验:

short - 2

int-4

float-4

double-8

指针-4

sizeof(union),以结构里面size最大的为union的size

·                                 27.struct 和 class

的区别

答案:struct 的成员默认是公有的,而类的成员默认是私有的。struct 和 class

在其他方面是功能相当的。

从感情上讲,大多数的开发者感到类和结构有很大的差别。感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位,而类就象活的并且可靠的社会成员,它有智能服务,有牢固的封装屏障和一个良好定义的接口。既然大多数人都这么认为,那么只有在你的类有很少的方法并且有公有数据(这种事情在良好设计的系统中是存在的!)时,你也许应该使用

struct 关键字,否则,你应该使用 class 关键字。

28.当一个类A

中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。(Autodesk)

答案:肯定不是零。举个反例,如果是零的话,声明一个class

A[10]对象数组,而每一个对象占用的空间是零,这时就没办法区分A[0],A[1]…了。

29. 在8086 汇编下,逻辑地址和物理地址是怎样转换的?(Intel)

答案:通用寄存器给出的地址,是段内偏移地址,相应段寄存器地址*10H+通用寄存器内地址,就得到了真正要访问的地址。

30. 比较C++中的4种类型转换方式?

请参考:http://blog.csdn.net/wfwd/archive/2006/05/30/763785.aspx,重点是static_cast,

dynamic_cast和reinterpret_cast的区别和应用。

31.分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句。

答案:

BOOL :    if ( !a ) or if(a)

int :     if ( a == 0)

float :   const EXPRESSION EXP = 0.000001

if ( a < EXP && a >-EXP)

pointer : if ( a != NULL) or if(a == NULL)

32.请说出const与#define 相比,有何优点?

答案:1) const

常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。

2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。

33.简述数组与指针的区别?

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。

(1)修改内容上的差别

char a[] = “hello”;

a[0] = ‘X’;

char *p = “world”; // 注意p 指向常量字符串

p[0] = ‘X’; // 编译器不能发现该错误,运行时错误

(2) 用运算符sizeof 可以计算出数组的容量(字节数)。sizeof(p),p

为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。C++/C

语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

char a[] = "hello world";

char *p = a;

cout<< sizeof(a) << endl; // 12 字节

cout<< sizeof(p) << endl; // 4 字节

计算数组和指针的内存容量

void Func(char a[100])

{

cout<< sizeof(a) << endl; // 4 字节而不是100

字节

}

34.类成员函数的重载、覆盖和隐藏区别?

答案:

a.成员函数被重载的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual 关键字可有可无。

b.覆盖是指派生类函数覆盖基类函数,特征是:

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual 关键字。

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual

关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

35. There are two int variables: a and b, don’t use

“if”, “? :”, “switch”or other judgement statements, find out the biggest

one of the two numbers.

答案:( ( a + b ) + abs( a - b ) ) / 2

36. 如何打印出当前源文件的文件名以及源文件的当前行号?

答案:

cout << __FILE__ ;

cout<__file__>

37. main 主函数执行完毕后,是否可能会再执行一段代码,给出说明?

答案:可以,可以用_onexit 注册一个函数,它会在main 之后执行int

fn1(void), fn2(void), fn3(void), fn4 (void);

void main( void )

{

String str("zhanglin");

_onexit( fn1 );

_onexit( fn2 );

_onexit( fn3 );

_onexit( fn4 );

printf( "This is executed first.\n" );

}

int fn1()

{

printf( "next.\n" );

return 0;

}

int fn2()

{

printf( "executed " );

return 0;

}

int fn3()

{

printf( "is " );

return 0;

}

int fn4()

{

printf( "This " );

return 0;

}

The _onexit function is passed the address of a

function (func) to be called when the program terminates normally. Successive

calls to _onexit create a register of functions that are executed in LIFO

(last-in-first-out) order. The functions passed to _onexit cannot take

parameters.

38. 如何判断一段程序是由C 编译程序还是由C++编译程序编译的?

答案:

#ifdef __cplusplus

cout<

#else

cout<

#endif

39.文件中有一组整数,要求排序后输出到另一个文件中

答案:

#i nclude

#i nclude

using namespace std;

void Order(vector& data)

//bubble sort

{

int count = data.size() ;

int tag = false ; // 设置是否需要继续冒泡的标志位

for ( int i = 0 ; i < count ; i++)

{

for ( int j = 0 ; j < count - i - 1 ; j++)

{

if ( data[j] > data[j+1])

{

tag = true ;

int temp = data[j] ;

data[j] = data[j+1] ;

data[j+1] = temp ;

}

}

if ( !tag )

break ;

}

}

void main( void )

{

vectordata;

ifstream in("c:\\data.txt");

if ( !in)

{

cout<

exit(1);

}

int temp;

while (!in.eof())

{

in>>temp;

data.push_back(temp);

}

in.close(); //关闭输入文件流

Order(data);

ofstream out("c:\\result.txt");

if ( !out)

{

cout<

exit(1);

}

for ( i = 0 ; i < data.size() ; i++)

out

out.close(); //关闭输出文件流

}

40. 链表题:一个链表的结点结构

struct Node

{

int data ;

Node *next ;

};

typedef struct Node Node ;

(1)已知链表的头结点head,写一个函数把这个链表逆序 ( Intel)

Node * ReverseList(Node *head) //链表逆序

{

if ( head == NULL || head->next == NULL )

return head;

Node *p1 = head ;

Node *p2 = p1->next ;

Node *p3 = p2->next ;

p1->next = NULL ;

while ( p3 != NULL )

{

p2->next = p1 ;

p1 = p2 ;

p2 = p3 ;

p3 = p3->next ;

}

p2->next = p1 ;

head = p2 ;

return head ;

}

(2)已知两个链表head1 和head2

各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)

Node * Merge(Node *head1 , Node *head2)

{

if ( head1 == NULL)

return head2 ;

if ( head2 == NULL)

return head1 ;

Node *head = NULL ;

Node *p1 = NULL;

Node *p2 = NULL;

if ( head1->data < head2->data

)

{

head = head1 ;

p1 = head1->next;

p2 = head2 ;

}

else

{

head = head2 ;

p2 = head2->next ;

p1 = head1 ;

}

Node *pcurrent = head ;

while ( p1 != NULL && p2 != NULL)

{

if ( p1->data <= p2->data )

{

pcurrent->next = p1 ;

pcurrent = p1 ;

p1 = p1->next ;

}

else

{

pcurrent->next = p2 ;

pcurrent = p2 ;

p2 = p2->next ;

}

}

if ( p1 != NULL )

pcurrent->next = p1 ;

if ( p2 != NULL )

pcurrent->next = p2 ;

return head ;

}

(3)已知两个链表head1 和head2

各自有序,请把它们合并成一个链表依然有序,这次要求用递归方法进行。 (Autodesk)

答案:

Node * MergeRecursive(Node *head1 , Node *head2)

{

if ( head1 == NULL )

return head2 ;

if ( head2 == NULL)

return head1 ;

Node *head = NULL ;

if ( head1->data < head2->data

)

{

head = head1 ;

head->next =

MergeRecursive(head1->next,head2);

}

else

{

head = head2 ;

head->next =

MergeRecursive(head1,head2->next);

}

return head ;

}

41. 分析一下这段程序的输出 (Autodesk)

class B

{

public:

B()

{

cout<

}

~B()

{

cout<

}

B(int i):data(i)    //B(int) works as a

converter ( int -> instance of  B)

{

cout

private:

int data;

};

B Play( B b)

{

return b ;

}

(1)

results:

int main(int argc, char* argv[])      constructed by

parameter 5

{                                     destructed

B(5)形参析构

B t1 = Play(5); B t2 = Play(t1);     destructed

t1形参析构

return 0;               destructed  t2 注意顺序!

}                                     destructed

t1

(2)                                   results:

int main(int argc, char* argv[])      constructed by

parameter 5

{                                     destructed

B(5)形参析构

B t1 = Play(5); B t2 = Play(10);     constructed by

parameter 10

return 0;               destructed  B(10)形参析构

}                                     destructed

t2 注意顺序!

destructed

t1

42. 写一个函数找出一个整数数组中,第二大的数 (microsoft)

答案:

const int MINNUMBER = -32767 ;

int find_sec_max( int data[] , int count)

{

int maxnumber = data[0] ;

int sec_max = MINNUMBER ;

for ( int i = 1 ; i < count ; i++)

{

if ( data > maxnumber )

{

sec_max = maxnumber ;

maxnumber = data ;

}

else

{

if ( data > sec_max )

sec_max = data ;

}

}

return sec_max ;

}

43. 写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数。

KMP算法效率最好,时间复杂度是O(n+m)。

44. 多重继承的内存分配问题:

比如有class A : public class B, public class C

{}

那么A的内存结构大致是怎么样的?

这个是compiler-dependent的, 不同的实现其细节可能不同。

如果不考虑有虚函数、虚继承的话就相当简单;否则的话,相当复杂。

可以参考《深入探索C++对象模型》,或者:

45. 如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针)

struct node { char val; node* next;}

bool check(const node* head) {} //return false :

无环;true: 有环

一种O(n)的办法就是(搞两个指针,一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合,反之亦然):

bool check(const node* head)

{

if(head==NULL)  return false;

node *low=head, *fast=head->next;

while(fast!=NULL &&

fast->next!=NULL)

{

low=low->next;

fast=fast->next->next;

if(low==fast) return true;

}

return false;

}

用c语言覆盖前一个字符的值,C/C++笔试题相关推荐

  1. C语言 --- 动态内存管理(上)+优化版通讯录+笔试题

    文章目录 前言 一.为什么存在动态内存分配 二.动态内存函数的介绍 2.1.malloc函数+free函数 2.2.calloc函数+free函数 2.3.realloc函数 三.常见的动态内存错误 ...

  2. 电信笔试C语言,电信的几个网络方面面试笔试题汇总

    选择题 1.通信网的基本结构形式有五种,以下正确的说法是(C) A.网型.星型.树型.环型.总线型; B.网型.星型.线型.复合型.环型; C.网型.星型.复合型.环型.总线型; D.网型.环型.线型 ...

  3. C语言中兴面试编程题,中兴一套笔试题及部分答案

    A .适用于最大似然准则 B .适用于最小似然准则 C .适用于似然比判决准则 D .适用于最大差错概率准则 3.下面关于源端口地址和目标端口地址的描述中,正确的是(A ) A .在TCP/UDP 传 ...

  4. Python查找任意字符串中只出现一次的字符(2016奇虎笔试题)

    '''    程序功能:    编写函数,给定任意字符串,找出其中只出现一次的字符,    如果有多个这样的字符,就全部找出.''' import sys def searchOne(s):     ...

  5. C语言-八道笔试题由浅入深玩转指针

    前言:本文章将带你刷8道比较有意思的指针笔试题,笔者将由深入浅出解析这些题目!必要的题目,作者已经加上内存布局图!希望本文对你有所帮助! 目录 一.笔试题1 -指针与一维数组的关系-值 二.笔试题2- ...

  6. R语言dataframe(data.table)使用用最近的前一个非NA值向前填充缺失值NA实战

    R语言dataframe(data.table)使用用最近的前一个非NA值向前填充缺失值NA实战 目录 R语言dataframe(data.tabl

  7. C语言结构体值复制与字符数组值复制的比较测试

    结构体值复制与变量值复制看起来用法差不多,字符数组值复制才是比较特殊的,因为它的名字代表的是指针而不知直接指向内存 下面是各自值复制的代码 #include <stdio.h> #incl ...

  8. 【C语言进阶】字符函数和字符串函数

    前言 在文章之前我们要知道C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中 或者字符数组中. 字符串常量适用于那些对它不做修改的字符串函数. 介绍常用 ...

  9. 易语言取linux命令返回值,易语言取程序返回值写法

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:易语言取程序返回值写法回答:在易语言中,程序包括"处理程序"都有六部分组成.一.程序名,就是程序的名称,程序名不 ...

最新文章

  1. mysql 5.7 多实例主从_mysql-5.7.20源码安装 + 多实例 + 主从复制
  2. win7系统相关问题故障解决
  3. 一道小时候经常玩的数字游戏
  4. 2 0 2 0 年 第 十 一 届 蓝 桥 杯 - 国赛 - CC++大学B组 - B.扩散
  5. mysql 重复字段查询及排除重复值
  6. P5287-[HNOI2019]JOJO【KMP】
  7. [css] 如果css文件过大时,如何异步加载它?
  8. @JsonProperty注解解析
  9. 国外一教授坦言,用这方法能迅速成为python程序员,但都不愿意说
  10. 新款iPhone SE来了,从二手市场保值率来看值不值得买?
  11. HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术
  12. 分享400多道算法题,来挑战吧
  13. 计算机模块中的画板英文,电脑中将画板导入Mockingbot的方法
  14. 24-思科防火墙:ASA透明防火墙实验
  15. 1976国际标准大气模型_Matlab
  16. python生成图像公章_仿真印章制作——三种方法
  17. java股票行情接口展示
  18. html5+在线字体,CSS3 字体
  19. matlab patch 六面体,[MATLAB数学相关] 求正六面体的细分格式
  20. Chrome 印象笔记.剪裁登录弹出国际版

热门文章

  1. sklearn 细节 —— LinearRegression、Ridge
  2. C 标准库 —— scanf(fflush(stdin))
  3. android phone win10下载,微软Your Phone新功能: 可在Win 10 PC 上运行 Android 应用程序...
  4. 屏幕为什么要正负压供电_焦炉煤气脱硫为什么要选择负压脱硫工艺?
  5. python从入门到精通 pdf 完整超清版-Python从入门到精通PDF高清完整版免费下载|百度云盘...
  6. python工资这么高为什么不学-为什么那么多人想学 Python?
  7. python软件下载教程-使用最方便的计算机编程软件,Python下载使用完美教程
  8. python软件下载视频教程-Python视频教程下载:Python从入门到精通【传智播客】
  9. vue jsx webpack报错_从零开始,使用webpack高效搭建react工作流
  10. JavaScript基础简单入门