⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c++面试试题.txt

📁 C++面试试题
💻 TXT
字号:
C++面试试题 + 基础 + 搞玩 oicqkill(原作)

(这条文章已经被阅读了841次) 时间:2003年08月04日 15:33 来源:李晓斌 教程

 
在的IT人 [有人说叫“挨踹人”]啊,大多浮躁得很,动不动说自己精通什么,其实,很多基础的都不知道,真是让人觉得悲哎啊。当然,我曾经也是这样的了
 
    下面都是雕虫小技,不等大堂之雅,还望莫笑,谢谢。
 
1、
void main(void)
{
  int nArrLength(400), i = 546;         // 主要是考看对C++的基础知识是否了解
  // 这里的int nArrLength(400)是对整数的定义,当然,明名上有问题,这里是故意这样的
  // 但是,最好是变量名改为 ....[还是您自己看着办了] 
  for (int i = 0; i< 99999999999; i++); // 这里是考对变量越界理解,同时....,
  // 所以,999...应该改为 ~((int)0),也就是整数中0取反
  // 考对变量块作用域的理解,这里的i,在循环后就不存在了

  cout << nArrLength << endl;           // 这里输出 400
  cout << i << endl;                    // 这里输出 546   
}
以上代码如果有错,请该正,并写出输出结果?
 

2、int i = 5, b = 7;
cout << (i+++b) <<endl;
不用调试,请说出,以上代码
在VC中和BCB中的输出结果??
VC  :12
BCB :13
 
3.写一个能做左值的函数(方法有很多)
  如:max(x, y) += 2874 + 55;
      drwline(x, y)++;
  答案:
  int &max(int & x, int & y)
  {
     return x > y? x : y;
  }
  int x = 55, y = 77;
  max(x, y) += 12 + 11; // 此时 y = 92;
  cout << "x = "x << "; y = "<< y << endl; // 输出 x = 55; y = 92;
 
 
===================================
下面的题来源与今年高程考试题
上面的是我自己弄着玩的
===================================

4.随便咱都行,只要不查资料,不问人
int strcmp(char *s,char *t)
{
while(*s && *t && _______ ) // *s == *t
{
s++;
t++;
}
 
return (______)             // *s - *t
}




c++面试题 
发表:2004-5-22 19:05:36  出处:你的博客网(yourblog.org) 
--------------------------------------------------------------------------------

不使用循环,如何获得一个32位无符号数里面被至1的位的个数 
这是tcl的一道面试题,想了很久没想出来, 

附送另外一道简单题 
如何不使用中间变量,将两个数交换值,就是swap(a,b) 
注意要完美解决哦 
h999999h给出 
a=(a+b)/2; 
b=b-a; 
a=b+a; 
b=a-b*2; 
smartsl给出 
代码: 
#include<stdio.h> 
#include<conio.h> 
int fun(unsigned long i) 
{ 
 if(i<=1)return i&1; 
 else return fun(i>>1)+(i&1); 
} 
void main() 
{ 
 unsigned long i; 
 for(i=0xF0000000;i<0xF0000010;i++) 
 {    
  printf("%lx --> %d\n",i,fun(i)); 
 } 
 getch(); 
}在TC2和VC6下编译通过。 

a=a+b; //a=(A+B),b=B 
b=a-b; //a=(A+B),b=A 
a=a-b; //a=B,b=A 
如果是float或者double可能有精确度问题。 
如果是整型,也可能有溢出问题。 

1、递归,smartsl给出的 
2、 
#include <unistd.h> 

void swap(void** a, void** b) { 
(long)*a = (long)*a^(long)*b; 
(long)*b = (long)*a^(long)*b; 
(long)*a = (long)*a^(long)*b; 
} 

int main() { 
float x=10,y=20; 
float *a = &x; 
float *b = &y; 
swap((void*)&a,(void*)&b); 
printf("%f,%f\n",*a,*b); 
return 0; 
} 

交换变量地址,兼容所有类型 
bbkxjy给出 
抄来的一个: 
代码: 
function CountBit(X: DWORD): DWORD; 
  {Count 1 bits in X} 
begin 
  X := X and $55555555 + X shr 1 and $55555555; 
  X := X and $33333333 + X shr 2 and $33333333; 
  X := X and $0f0f0f0f + X shr 4 and $0f0f0f0f; 
  X := X and $00ff00ff + X shr 8 and $00ff00ff; 
  X := X and $0000ffff + X shr 16 and $0000ffff; 
  Result := X; 
end; 

在 HyperString (一个third party的Delphi函数库)里面找到的,但最初应该是在Borland的新闻组里面给出的。另外还可以用 lookup table 的办法,也比较快。 
代码: 
unsigned long CountBit(unsigned long X) 
{ 
  X = X & 0x55555555 + X >> 1 & 0x55555555; 
  X = X & 0x33333333 + X >> 2 & 0x33333333; 
  X = X & 0x0F0F0F0F + X >> 4 & 0x0F0F0F0F; 
  X = X & 0x00FF00FF + X >> 8 & 0x00FF00FF; 
  X = X & 0x0000FFFF + X >> 16 & 0x0000FFFF; 
  return(X); 
} 

引用: 
最初由 lroc 发表 
如果lookup办法是拆成8x4bits,不见得比循环快啊。 
32次循环全是寄存器里完成的,8次查找可以认为是1次内存、7次cache。 

changxing给出 

这个要看编译器了 

引用: 
最初由 smartsl 发表 
C语言有优先级问题,应该这样写: 

unsigned long CountBit(unsigned long X) 
........ 


double 也适用, struct 都没问题,只要cpu是32位的(因为是long) 
代码: 
#include <stdio.h> 

typedef struct __var { 
    int x; 
    float y; 
} _var; 

void swap(void** a, void** b) { 
    (long)*a = (long)*a^(long)*b; 
    (long)*b = (long)*a^(long)*b; 
    (long)*a = (long)*a^(long)*b; 
} 

int main() { 
    _var x = {10,11.1}; 
    _var y = {20,22.2}; 
    _var *a = &x; 
    _var *b = &y; 
    swap((void*)&a,(void*)&b); 
    printf("%d,%f | %d,%f\n",a->x,a->y,b->x,b->y); 
    return 0; 
} 
"swap.c" 23L, 428C written 
# gcc -Wall -oswap swap.c 
# ./swap 
20,22.200001 | 10,11.100000 
# 

引用: 
最初由 snowolf 发表 
swap俺也想到了 
a= a 异或 b; 
b= a 异或 b; 
a= a 异或 b; 

今天重翻老谭的《C程序设计》,原来里面都提到了两个数互换数值不用中间变量的方法,就是异或运算。 
假设a和b要互换,那么换成Newa=b,Newb=a。 
Newb=(a XOR b) XOR b = a XOR b XOR b = a XOR (b XOR b) = a XOR 0 = a 
Newa=(a XOR b) XOR Newb = a XOR b XOR a = (a XOR a) XOR b = 0 XOR b = b


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -