• C++查缺补漏4,赶紧的


    请说出const与#define 相比,有何优点?
    答案:
    1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
          2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。

    在8086 汇编下,逻辑地址和物理地址是怎样转换的?(Intel)
    答案:通用寄存器给出的地址,是段内偏移地址,相应段寄存器地址*10H+通用寄存器内地址,就得到了真正要访问的地址。

    当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。(Autodesk)
    答案:肯定不是零。举个反例,如果是零的话,声明一个class A[10]对象数组,而每一个对象占用的空间是零,这时就没办法区分A[0],A[1]…了。

     描述内存分配方式以及它们的区别?
    1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量
    2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
    3) 从堆上分配亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。

     main 函数执行以前,还会执行什么代码?
    答案:全局对象的构造函数会在main 函数之前执行。

     C++是不是类型安全的?
    答案:不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。C#是类型安全的。

    有哪几种情况只能用intialization list 而不能用assignment?

    答案:当类中含有const、reference 成员变量;基类的构造函数都需要初始化表。

    define DOUBLE(x) x+x ,i = 5*DOUBLE(5); i 是多少?
    答案:i 为30

    New delete 与malloc free 的联系与区别?
    答案:都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。delete 会调用对象的destructor,而free 不会调用对象的destructor.

    1、写一个“标准”宏,这个宏输入两个参数并返回较小的一个。
    .#define Min(X, Y) ((X)>(Y)?(Y):(X))//结尾没有;
    2、嵌入式系统中经常要用到无限循环,你怎么用C编写死循环。
    while(1){}或者for(;;)
    3、关键字static的作用是什么?
    定义静态变量
    4、关键字const有什么含意?
    表示常量不可以修改的变量。
    5、关键字volatile有什么含意?并举出三个不同的例子?
    提示编译器对象的值可能在编译器未监测到的情况下改变。


    int (*s[10])(int) 表示的是什么啊
    int (*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。


    1.有以下表达式:
    int a=248; b=4;int const c=21;const int *d=&a;
    int *const e=&b;int const *f const =&a;
    请问下列表达式哪些会被编译器禁止?为什么?
    *c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;
    *c 这是个什么东东,禁止
    *d 说了是const, 禁止
    e = &a 说了是const 禁止
    const *f const =&a; 禁止
    2.交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;
    有两种解法, 一种用算术算法, 一种用^(异或)
    a = a + b;
    b = a - b;
    a = a - b; 
    or
    a = a^b;// 只能对int,char..
    b = a^b;
    a = a^b;
    or
    a ^= b ^= a;
    3.c和c++中的struct有什么不同?
    c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private
    4.#i nclude <stdio.h>
    #i nclude <stdlib.h>
    void getmemory(char *p)
    {
        p=(char *) malloc(100);
        strcpy(p,"hello world");
    }
    int main( )
    {
        char *str=NULL;
        getmemory(str);
        printf("%s/n",str);
        free(str);
        return 0;
       }
    程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险
    5.char szstr[10];
    strcpy(szstr,"0123456789");
    产生什么结果?为什么?
    长度不一样,会造成非法的OS
    6.列举几种进程的同步机制,并比较其优缺点。
       原子操作 
    信号量机制
       自旋锁
       管程,会合,分布式系统

    7.进程之间通信的途径
    共享存储系统
    消息传递系统
    管道:以文件系统为基础
    11.进程死锁的原因
    资源竞争及进程推进顺序非法
    12.死锁的4个必要条件
    互斥、请求保持、不可剥夺、环路
    13.死锁的处理
    鸵鸟策略、预防策略、避免策略、检测与解除死锁
    15.   操作系统中进程调度策略有哪几种?
    FCFS(先来先服务),优先级,时间片轮转,多级反馈
    8.类的静态成员和非静态成员有何区别?
    类的静态成员每个类只有一个,非静态成员每个对象一个
    9.纯虚函数如何定义?使用时应注意什么?
    virtual void f()=0;
    是接口,子类必须要实现
    10.数组和链表的区别
    数组:数据顺序存储,固定大小
    连表:数据可以随机存储,大小可动态改变

    12.ISO的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点?
    应用层
    表示层
    会话层
    运输层
    网络层
    物理链路层
    物理层
    tcp /udp属于运输层
    TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。
    与 TCP 不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较简单, UDP 头包含很少的字节,比 TCP 负载消耗少。
    tcp: 提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好
    udp: 不提供稳定的服务,包头小,开销小  


    1:(void *)ptr 和 (*(void**))ptr的结果是否相同?其中ptr为同一个指针
    .(void *)ptr 和 (*(void**))ptr值是相同的
    2:int main()
       {
        int x=3;
        printf("%d",x);
        return 1;
       
       }
    问函数既然不会被其它函数调用,为什么要返回1?
    mian中,c标准认为0表示成功,非0表示错误。具体的值是某中具体出错信息


    1,要对绝对地址0x100000赋值,我们可以用
    (unsigned int*)0x100000 = 1234;
    那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?
    *((void (*)( ))0x100000 ) ( );
    首先要将0x100000强制转换成函数指针,即:
    (void (*)())0x100000
    然后再调用它:
    *((void (*)())0x100000)();
    用typedef可以看得更直观些:
    typedef void(*)() voidFuncPtr;
    *((voidFuncPtr)0x100000)();
    2,已知一个数组table,用一个宏定义,求出数据的元素个数
    #define NTBL
    #define NTBL (sizeof(table)/sizeof(table[0]))

    面试题: 线程与进程的区别和联系? 线程是否具有相同的堆栈? dll是否有独立的堆栈?
    进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。

    每个线程有自己的堆栈。
    DLL中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是否有问题。因为DLL中的代码是被某些线程所执行,只有线程拥有堆栈,如果DLL中的代码是EXE中的线程所调用,那么这个时候是不是说这个DLL没有自己独立的堆栈?如果DLL中的代码是由DLL自己创建的线程所执行,那么是不是说DLL有独立的堆栈?

    以上讲的是堆栈,如果对于堆来说,每个DLL有自己的堆,所以如果是从DLL中动态分配的内存,最好是从DLL中删除,如果你从DLL中分配内存,然后在EXE中,或者另外一个DLL中删除,很有可能导致程序崩溃


    unsigned short A = 10;
    printf("~A = %u\n", ~A);

    char c=128; 
    printf("c=%d\n",c);

    输出多少?并分析过程
    第一题,~A =0xfffffff5,int值 为-11,但输出的是uint。所以输出4294967285
    第二题,c=0x10,输出的是int,最高位为1,是负数,所以它的值就是0x00的补码就是128,所以输出-128。
    这两道题都是在考察二进制向int或uint转换时的最高位处理。

    分析下面的程序:
    void GetMemory(char **p,int num)
    {
        *p=(char *)malloc(num);
        
    }        
    int main()
    {
        char *str=NULL;
        
        GetMemory(&str,100);
        
        strcpy(str,"hello");
        
        free(str);
        
        if(str!=NULL)
        {
            strcpy(str,"world");
        }    
            
        printf("\n str is %s",str);
        getchar();
    }    
    问输出结果是什么?希望大家能说说原因,先谢谢了
    输出str is world。
    free 只是释放的str指向的内存空间,它本身的值还是存在的.
    所以free之后,有一个好的习惯就是将str=NULL.
    此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的,
    尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出world来。
    这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。
    当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的,只不过。。。。。。。。楼上都说过了,最好别这么干。

    char a[10],strlen(a)为什么等于15?运行的结果

    #i nclude "stdio.h"
    #i nclude "string.h"

    void main()
    {

    char aa[10];
    printf("%d",strlen(aa));
    }

    sizeof()和初不初始化,没有关系;
    strlen()和初始化有关。


    char (*str)[20];/*str是一个数组指针,即指向数组的指针.*/
    char *str[20];/*str是一个指针数组,其元素为指针型数据.*/

    long a=0x801010;
    a+5=?
    0x801010用二进制表示为:“1000 0000 0001 0000 0001 0000”,十进制的值为8392720,再加上5就是8392725罗

    1)给定结构struct A 
    {
           char t:4;
           char k:4;
           unsigned short i:8;
           unsigned long m;
    };问sizeof(A) = ?
    给定结构struct A 
    {
           char t:4; 4位
           char k:4; 4位
           unsigned short i:8; 8位      
           unsigned long m; // 偏移2字节保证4字节对齐
    }; // 共8字节
    2)下面的函数实现在一个数上加一个数,有什么错误?请改正。
    int add_n ( int n )
    {
        static int i = 100;
        i += n;
        return i;
    }
    当你第二次调用时得不到正确的结果,难道你写个函数就是为了调用一次?问题就出在 static上?


    // 帮忙分析一下
    #i nclude<iostream.h>
    #i nclude <string.h>
    #i nclude <malloc.h>
    #i nclude <stdio.h>
    #i nclude <stdlib.h>
    #i nclude <memory.h>
    typedef struct AA
    {
            int b1:5;
            int b2:2;
    }AA;
    void main()
    {
            AA aa;
            char cc[100];
             strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");
           memcpy(&aa,cc,sizeof(AA));
            cout << aa.b1 <<endl;
            cout << aa.b2 <<endl;
    }
    答案是 -16和1
    首先sizeof(AA)的大小为4,b1和b2分别占5bit和2bit.
    经过strcpy和memcpy后,aa的4个字节所存放的值是:
    0,1,2,3的ASC码,即00110000,00110001,00110010,00110011
    所以,最后一步:显示的是这4个字节的前5位,和之后的2位
    分别为:10000,和01
    因为int是有正负之分  所以:答案是-16和1

    求函数返回值,输入x=9999; 
    int func ( x )

        int countx = 0; 
        while ( x ) 
        { 
            countx ++; 
            x = x&(x-1); 
        } 
        return countx; 

    结果呢?
    知道了这是统计9999的二进制数值中有多少个1的函数,且有
    9999=9×1024+512+256+15

    9×1024中含有1的个数为2;
    512中含有1的个数为1;
    256中含有1的个数为1;
    15中含有1的个数为4;
    故共有1的个数为8,结果为8。
    1000 - 1 = 0111,正好是原数取反。这就是原理。
    用这种方法来求1的个数是很效率很高的。
    不必去一个一个地移位。循环次数最少。

    int a,b,c 请写函数实现C=a+b ,不可以改变数据类型,如将c改为long int,关键是如何处理溢出问题
    bool add (int a, int b,int *c)
    {
    *c=a+b;
    return (a>0 && b>0 &&(*c<a || *c<b) || (a<0 && b<0 &&(*c>a || *c>b)));
    }


    分析:
    struct bit 
    {   int a:3; 
        int b:2; 
        int c:3; 
    }; 
    int main() 

    bit s; 
    char *c=(char*)&s; 
       cout<<sizeof(bit)<<endl;
    *c=0x99;
       cout << s.a <<endl <<s.b<<endl<<s.c<<endl; 
         int a=-1;
       printf("%x",a);
    return 0; 

    输出为什么是
    4
    1
    -1
    -4
    ffffffff
    因为0x99在内存中表示为 100 11 001 , a = 001, b = 11, c = 100
    当c为有符合数时, c = 100, 最高1为表示c为负数,负数在计算机用补码表示,所以c = -4;同理 
    b = -1;
    当c为有符合数时, c = 100,即 c = 4,同理 b = 3


    位域 :   
    有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:     
    struct 位域结构名     
    { 位域列表 };    
    其中位域列表的形式为: 类型说明符 位域名:位域长度     
    例如:     
    struct bs    
    {    
    int a:8;    
    int b:2;    
    int c:6;    
    };    
    位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:     
    struct bs    
    {    
    int a:8;    
    int b:2;    
    int c:6;    
    }data;    
    说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:   

    1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:     
    struct bs    
    {    
    unsigned a:4    
    unsigned :0 /*空域*/    
    unsigned b:4 /*从下一单元开始存放*/    
    unsigned c:4    
    }    
    在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。   

    2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。   

    3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:     
    struct k    
    {    
    int a:1    
    int :2 /*该2位不能使用*/    
    int b:3    
    int c:2    
    };    
    从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。   

    二、位域的使用位域的使用和结构成员的使用相同,其一般形式为: 位域变量名•位域名 位域允许用各种格式输出。    
    main(){    
    struct bs    
    {    
    unsigned a:1;    
    unsigned b:3;    
    unsigned c:4;    
    } bit,*pbit;    
    bit.a=1;    
    bit.b=7;    
    bit.c=15;    
    pri

    改错:
    #i nclude <stdio.h>

    int main(void) {

        int **p;
        int arr[100];

        p = &arr;

        return 0;
    }
    解答:
    搞错了,是指针类型不同,
    int **p; //二级指针
    &arr; //得到的是指向第一维为100的数组的指针
    #i nclude <stdio.h>
    int main(void) {
    int **p, *q;
    int arr[100];
    q = arr;
    p = &q;
    return 0;
    }


    下面这个程序执行后会有什么错误或者效果:
    #define MAX 255
    int main()
    {
       unsigned char A[MAX],i;//i被定义为unsigned char
       for (i=0;i<=MAX;i++)
          A[i]=i;
    }
    解答:死循环加数组越界访问(C/C++不进行数组越界检查)
    MAX=255 
    数组A的下标范围为:0..MAX-1,这是其一..
    其二.当i循环到255时,循环内执行:
    A[255]=255;
    这句本身没有问题..但是返回for (i=0;i<=MAX;i++)语句时,
    由于unsigned char的取值范围在(0..255),i++以后i又为0了..无限循环下去.

    struct name1{
       char str;
       short x;
       int   num;
    }

    struct name2{
       char str;
       int num;
       short x;
    }

    sizeof(struct name1)=8,sizeof(struct name2)=12
    在第二个结构中,为保证num按四个字节对齐,char后必须留出3字节的空间;同时为保证整个结构的自然对齐(这里是4字节对齐),在x后还要补齐2个字节,这样就是12字节。

    intel:
    A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈还是堆或者其他的)?
    static的全局变量,表明这个变量仅在本模块中有意义,不会影响其他模块。
    他们都放在数据区,但是编译器对他们的命名是不同的。
    如果要使变量在其他模块也有意义的话,需要使用extern关键字。

    struct s1
    {
    int i: 8;
    int j: 4;
    int a: 3;
    double b;
    };

    struct s2
    {
    int i: 8;
    int j: 4;
    double b;
    int a:3;
    };

    printf("sizeof(s1)= %d\n", sizeof(s1));
    printf("sizeof(s2)= %d\n", sizeof(s2));
    result: 16, 24
    第一个struct s1
    {
    int i: 8;
    int j: 4;
    int a: 3;
    double b;
    };
    理论上是这样的,首先是i在相对0的位置,占8位一个字节,然后,j就在相对一个字节的位置,由于一个位置的字节数是4位的倍数,因此不用对齐,就放在那里了,然后是a,要在3位的倍数关系的位置上,因此要移一位,在15位的位置上放下,目前总共是18位,折算过来是2字节2位的样子,由于double是8字节的,因此要在相对0要是8个字节的位置上放下,因此从18位开始到8个字节之间的位置被忽略,直接放在8字节的位置了,因此,总共是16字节。

    第二个最后会对照是不是结构体内最大数据的倍数,不是的话,会补成是最大数据的倍数

    上面是基本问题,接下来是编程问题:


    本人很弱,这几个题也搞不定,特来求救:
    1)读文件file1.txt的内容(例如):
    12
    34
    56
    输出到file2.txt:
    56
    34
    12
    (逆序)
    2)输出和为一个给定整数的所有组合
    例如n=5
    5=1+4;5=2+3(相加的数不能重复)
    则输出
    1,4;2,3。
    望高手赐教!!

    第一题,注意可增长数组的应用.
    #i nclude <stdio.h>
    #i nclude <stdlib.h>

    int main(void)
    {
             int MAX = 10;
    int *a = (int *)malloc(MAX * sizeof(int));
    int *b;
        
    FILE *fp1;
    FILE *fp2;

    fp1 = fopen("a.txt","r");
    if(fp1 == NULL)
    {printf("error1");
        exit(-1);
    }

        fp2 = fopen("b.txt","w");
    if(fp2 == NULL)
    {printf("error2");
        exit(-1);
    }

    int i = 0;
        int j = 0;

    while(fscanf(fp1,"%d",&a[i]) != EOF)
    {
    i++;
    j++;
    if(i >= MAX)
    {
    MAX = 2 * MAX;
    b = (int*)realloc(a,MAX * sizeof(int));
    if(b == NULL)
    {
    printf("error3");
    exit(-1);
    }
    a = b;
    }
    }

    for(;--j >= 0;)
       fprintf(fp2,"%d\n",a[j]);

    fclose(fp1);
    fclose(fp2);

    return 0;
    }

    第二题.
    #i nclude <stdio.h>

    int main(void)
    {
    unsigned long int i,j,k;

    printf("please input the number\n");
    scanf("%d",&i);
        if( i % 2 == 0)
            j = i / 2;
    else
    j = i / 2 + 1;

    printf("The result is \n");
        for(k = 0; k < j; k++)
         printf("%d = %d + %d\n",i,k,i - k);
    return 0;
    }

    #i nclude <stdio.h>
    void main()
    {
    unsigned long int a,i=1;
    scanf("%d",&a);
    if(a%2==0)
    {
         for(i=1;i<a/2;i++)
         printf("%d",a,a-i);
    }
    else
    for(i=1;i<=a/2;i++)
            printf(" %d, %d",i,a-i);
    }

    兄弟,这样的题目若是做不出来实在是有些不应该, 给你一个递规反向输出字符串的例子,可谓是反序的经典例程.

    void inverse(char *p)
    {
        if( *p = = '\0' ) 
    return;
        inverse( p+1 );
        printf( "%c", *p );
    }

    int main(int argc, char *argv[])
    {
        inverse("abc\0");

        return 0;
    }

    借签了楼上的“递规反向输出”
    #i nclude <stdio.h>
    void test(FILE *fread, FILE *fwrite)
    {
            char buf[1024] = {0};
            if (!fgets(buf, sizeof(buf), fread))
         &nb



  • 相关阅读:
    POJ2376 Cleaning Shifts
    百度首页图标
    NOIP2016换教室
    CH3803扑克牌
    【POJ2723】Get Luffy Out
    【USACO13DEC】 最优挤奶
    【SP2916】Can you answer these queries V
    【线段树】各种模板集合
    【SCOI2013】摩托车交易
    【CF1174D】 Ehab and the Expected XOR Problem
  • 原文地址:https://www.cnblogs.com/rollenholt/p/2422454.html
Copyright © 2020-2023  润新知