1. c/c++的逻辑运算中,什么数字认为是True?--非0的数字
2. 什么是内联函数?
在函数声明或定义时,将inline关键字加在函数返回类型前面的就是内联函数。。。
在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用函数带来的额外时间开支。但在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的对较复杂的函数进行内联扩展将带来很大的存储资源开支。另外还需要非常注意的是对递归函数的内联扩展可能带来部分编译器的无穷编译。
3. 什么是内存对齐?
结构体的内存布局依赖于CPU、操作系统、编译器及编译时的对齐选项。结构体内部成员的对齐要求,结构体本身的对齐要求。最重要的有三点
(一)成员对齐。对于结构体内部成员,通常会有这样的规定:各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。但是也可以看到,有时候某些字段如果严格按照大小紧密排列,根本无法达到这样的目的,因此有时候必须进行padding。各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节编译器会自动填充也就是padding。
(二)然后,还要考虑整个结构体的对齐需求。ANSI C标准规定结构体类型的对齐要求不能比它所有字段中要求最严格的那个宽松,可以更严格。实际上要求结构体至少是其中的那个最大的元素大小的整数倍。因为有时候我们使用的是结构体数组,所以结构体的大小还得保证结构体数组中各个结构体满足对齐要求,同时独立的结构体与结构体数组中单个结构体的大小应当是一致的。
(三)编译器的对齐指令。VC中提供了#pragmapack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数。
4. “传值”,“传指针”,“传引用”的作用?
值传递:只给函数提供输入值,需要复制开销,大对象很少使用值传递。
指针传递:可以改变指针指向内容的值,但是不能改变指针本身,无需复制开销。如果需要改变指针本身,可以使用二重指针或者指针引用。
引用传递:除了提供输入值外,还返回操作结果,无需复制开销。
基础类型传值、普通的非多态的对象传引用,多态对象以及分配在堆上的对象传指针。
5. 隐式拷贝构造函数可能出现的问题?
如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String的两个对象a,b为例,假设a.m_data的内容为“hello”,b.m_data的内容为“world”。
现将a赋给b,缺省赋值函数的“位拷贝”意味着执行b.m_data=a.m_data。这将造成三个错误:一是b.m_data原有的内存没被释放,造成内存泄露;二是b.m_data和a.m_data指向同一块内存,a或b任何一方变动都会影响另一方;三是在对象被析构时,m_data被释放了两次。
6. 虚析构函数的作用?
写成虚的是为了在实现多态的时候不造成内存泄露
7. Int a=b*4
int a=b/16
int a=(b+c)/2
int a=(b*3)/8
int a=(b%8)*4
8. 一下代码输出结果
Class A{
A(){printf(“1”);}
~A(){printf(“2”);}
Void print(){
Printf(“3”);
}
};
Class B:public A{
B(){printf(“4”);}
~B(){printf(“5”);}
Virtual Void print(){
Printf(“6”);
}
};
Class C:public B{
C(){printf(“7”);}
~C(){printf(“8”);}
Virtual Void print(){
Printf(“9”);
}
};
Int main(){
A*a=(A*)new B;
a->print():
B*b=(B*)new c;
b->print();
delete a;
delete b;
}
39285
1、 写一个函数:bool fun(int num)实现判断一个数字是否为质数。
bool fun(int num)
{
if (num == 0 || num == 1 ) { printf("0和1不属于质数问题讨论范围。\n"); return false; }//end if if (n == 2 || n == 3) { return true; }
int j,k;
bool flag=true;
k=sqrt(num);
for(j=2;j<=k;j++)
{
if(num %j==0)
{
flag=0;
break;
}
}
if(flag)
return true;
else
return false;
}
2、写一个函数:void disp()输出1到100的数字,如果数字是3的倍数则输出Nab,如果数字是5的倍数输出Zif,如果数字即是3的倍数又是5的倍数输出ZifNib,其他情况输出该 数字。
void disp(){
for(int i=1;i<=100;i++){
if((i%3==0)&&(i%5==0)){
cout<<i<<":ZifNib"<<endl;
continue;
}
if(i%3==0){
cout<<i<<":Nab"<<endl;
continue;
}
if(i%5==0){
cout<<i<<":Zif"<<endl;
continue;
}
cout<<i<<" "<<endl;
}
}
3、 写一个函数,short fun(int color)将一个32位的颜色值 压缩为16位,压缩方式通常为丢弃颜色值的低位,保留高位,32位颜色值的格式 为XXXXXXXXRRRRRRRRGGGGGGGGBBBBBBBB,假设高8位无作用。压缩后的16位颜色值应该为RRRRRBBBBBBGGGGG.
short fun(int color)
{
return color&0x0fff;
}
4、 写一个函数实现字符串的压缩存储,函数原型为 void fun(char *str),假设输入字符串只含字母,压缩方式为:如果字符串中出现连续相同字符,则存储为字符的重 复次数+字符本身,如果字母不连续出现,则存储源字符,例如:strStr = “ABBCCCDBB”, 则压缩后的字符串为 “A2B3CD2B”。
#include <stdio.h>
#include <malloc.h>
void f(char *str)
{
char *des=(char *)malloc(100*sizeof(char));
char *s=des;
int cnt=0;
while(*str)
{
cnt++;
str++;
if(*str!=*(str-1))
{
if (cnt !=1)
{
*des=cnt+0x30;
des++;
}
*des=*(str-1);
des++;
cnt=0;
}
}
des++;
*des = '\0';
}
void main()
{
char *str = "ABBCCCDBB";
f(str);
}
5:写一个int max(int a, int b),实现求a ,b中的最大数,要求不能用if else语句,不能用条件运算符,不能用循环,不能用switch。
int max(int a, int b)
{
int buf[2]={x,y}; unsigned int z; z=x-y; z>>=31; return buf[z];
}
6:将一个整数进行移位运算,左移时各个编译器均在最右侧移入0,但右移时,根据编译器的不同,某些编译器左侧移入0,某些编译器移入符号位。写一个函数 屏蔽掉编译器之 间的差别,使右移运算可以按照我们的方式规定来移入0或者符号位,函数原型为 int fun(int num, int bit, int flag),num表示待移位整形数字,bit表示移位的位数,flag为 0表示最左侧移入0,flag为 非0表示移入符号位。
int
fun(
int
num,
int
bit,
int
flag)
{
int
s;
int
i;
for
(i = 0; i < bit; i++)
{
s = num & 0x80000000;
num >>= 1;
if
(flag && s)
num |= 0x80000000;
else
num &= ~0x80000000;
}
return num;
}