📄 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 + -