似水流年的个人主页

http://www.qtcn.org/bbs/u/127280  [收藏] [复制]

似水流年

  • 24

    关注

  • 11

    粉丝

  • 29

    访客

  • 等级:新手上路
  • 总积分:25
  • 保密,2011-01-01

最后登录:2021-05-11

更多资料

日志

常见C++面试题解析

2012-12-25 21:55
  1. //============================================================================
    // Name        : ProTest.cpp
    // Author      : Binbin.Song
    // Version     :
    // Copyright   : 2012 SoftWare Inc.
    // Description :  C++, Ansi-style
    //============================================================================
    #include
    #include
    #include
    #include
    #include
    using namespace std;
    #define CUBE(i) ((i) * (i) * (i))
    #define FOUTH(i) ((i) * (i) * (i) * (i))
    int main()
    {
    //eg1.自增自减
    /*********************************************************
    int a,b,c,d;
    a=10;
    b=a++;
    c=++a;
    d=10*a++;
    //10, 12, 120
    //a++在使用a之后给a加一, ++a在使用a之前给a+1
    cout << "b, c, d:"<<b<<","<<c<<","<<d<<endl;
    ***********************************************************/
    //eg2.结构体和共用体
    /*********************************************************
    typedef union
    {
      long i;
      int k[5];
      char c;
    } DATE;
    struct data
    {
      int cat;
      DATE cow;
      double dog;
    };
    DATE max;
    //union共用一块内存,其内存的大小为其成员中占用存储空间最大的成员所占用的大小,DATE的内存大小为 4*5=20
    //结构体struct data的大小为其成员所占的存储空间的大小,其大小为:4 + 20 + 8 = 32;
    printf("%d\n",sizeof(struct data)+sizeof(max));
    ***********************************************************/
    //eg3.函数指针
    /*********************************************************
      int inc(int a)
    {
      return(++a);
    }
    int multi(int* a,int* b,int* c)
    {
      //11*10
      return(*c =*a * *b);
    }
    typedef int(FUNC1)(int in); // 定义函数指针FUNC1指向参数为整型返回指为整型的函数
    typedef int(FUNC2) (int*,int*,int*);// 定义函数指针FUNC1指向参数为三个整型指针返回指为整型的函数
    void show(FUNC2 fun,int arg1, int*arg2)
    {
      FUNC1 pf = &inc;
      int temp = pf(arg1);
      //arg1 = 10, temp = 11, arg2 = ??
      fun(&temp,&arg1, arg2);
      //arg1 = 10, temp = 11, arg2 = 110
      printf("%d\n",*arg2);
    }
    int a; //局部变量a为0;
    show(multi,10,&a);
    ***********************************************************/
    //eg4.字符串逆转
    /*********************************************************
    char str[] = "12345";
    doExchange(str);
    void doExchange(char* str)
    {
      int len = strlen(str);
      cout << "strlen(str):" << len << endl;;
      char temp;
      for(int i = 0; i < len/2; i++)
      {
       temp = str[i];
       str[i] = str[len - i - 1];1,4,2,5,2,6,8,3,9
       str[len - i - 1] = temp;
      }
    }
    cout <<"str = " <<str << endl;
    ***********************************************************/
    //eg5.指针的运算
    /*********************************************************
    unsigned char *p1;
    unsigned long *p2;
    cout << "=======" < (y) ? (x) : (y))
    #define MIN(X, Y) ((X) > (Y) ? (Y) : (X))
    int a = 3, b = 5;
    SWAP(a, b)
    int max = MAX(a, b);
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "MAX(a, b) = " << max << endl;
    ***********************************************************/
    //eg7.算法1(数组中存放n ~ n-1 个数,有一个数被重放了一次,求这个数,时间复杂度 O(n))
    /*********************************************************
    int array[5] = {1,2,2,3,4};
    int sumArray = 0, sum = 0;
    for(int i = 0; i < 5; i++)
    {
      sumArray += array[i];
    }
    sum = 5*(5 - 1)/2;
    int num = sum - sumArray;
    cout << "number is:" << num <<endl;
    ***********************************************************/
    //eg8.算法2(判断一个数是不是2的n次幂,一行代码实现)
    /*********************************************************
    //位与为0,则表示是2的若干次幂
    int i = 2;
    cout << ((i & (i - 1)) ? false : true) << endl;
    ***********************************************************/
    //eg9.sizeof 和 strlen
    /*********************************************************
    char str[] = {"hello"};
    char *ptr = str;
    //sizeof为运算符,当其参数为数组时,返回数组的大小,当其参数为指针时,返回指针类型大小4
    //sizeof计算常量自字符串时包括系统自动添加的\0
    //当数组作为函数参数时,退化为函数指针
    //输出结果为:5 6 5 4
    cout<< "strlen(str) = " << strlen(str) << endl;
    cout<< "sizeof(str) = " << sizeof(str) <<endl;
    cout<< "strlen(str) = " << strlen(ptr) << endl;
    cout<< "sizeof(str) = " << sizeof(ptr) <<endl;
    ***********************************************************/
    //eg10.数组指针
    /*********************************************************
    //a为数组指针,给其地址加1时系统会做加一个数组位移处理(4 * 5),所以(&a+1)指向数组a末位的下一地址
    //当强制转换为int时,则 a - 1 只移动一个整数位
    //输出结果:2,5
    int a[5]={1,2,3,4,5};
    int *ptr=(int *)(&a+1);
    printf("%d,%d",*(a+1),*(ptr-1));
    ***********************************************************/
    //eg11.位域的计算
    /*********************************************************
    //位域指在内存中只占某些特定位的一类数据结构,为原子化数据单元
    //SS中s1占前两位,s2占2~4三位,s3占5~7三位
    //采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,
    //而Big-endian模式对操作数的存放方式是从高字节到低字节。也就是说
    //Big-endian模式符合人的习惯,而Little-endian更加方便计算机操作。
    //例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
    //内存地址 0x4000 0x4001
    //存放内容 0x34 0x12
    //而在Big-endian模式CPU内存中的存放方式则为:
    //内存地址 0x4000 0x4001
    //存放内容 0x12 0x34
    union
    {
      struct
      {
       unsigned int s1:2;
       unsigned int s2:3;
       unsigned int s3:3;
      }SS;
      unsigned int v;
    }U;
    U.v = 15;
    //union共用一块内存,所以struct里存放的就是union成员v的二进制位
    //15的二进制为:1111,则U在内存中的存放形式为(大端):00000000 00000000 00000000 00001111 (小端):11110000 00000000 00000000 00000000
    cout << "U.SS.s1 = " << U.SS.s1 <<endl;
    cout << "U.SS.s2 = " << U.SS.s2 <<endl;
    cout << "U.SS.s3 = " << U.SS.s3 <<endl;
    ***********************************************************/
    //eg12.判断大小端的方法
    /*********************************************************
    //计算机读取地址的方式是从底地址开始,向高地址移动,要判断一个机器是打断还是小端,则可通过存储int a = 1;
    //来看其地地址存放的是不是1,如果存放的是1,则证明是小端,如果不是1则证明是大端
    //方法1(利用强制转换)
    int i = 1;
    char* p = (char*)&i;
    if(*p == 1)
    {
      cout << "Little-endian"<<endl;
    }
    else
    {
      cout << "Big-endian"<<endl;
    }
    //方法2(利用共用体特性)
    union
    {
      int a;
      char b;
    }U;
    U.a = 1;
    if(U.b == 1)
    {
      cout << "Little-endian"<<endl;
    }
    else
    {
      cout << "Big-endian"<<endl;
    }
    ***********************************************************/
    //eg13.交换两个变量的值,不使用中间变量
    //方法一(加减法)
    /*********************************************************
    int a = 3, b = 5;
    a = a + b;
    b = a - b;
    a = a - b;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    //方法二(异或)
    a = a ^ b;
    b = a ^ b; //a ^ b ^ b = a
    a = a ^ b; //a ^ b ^ a = b
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    ***********************************************************/
    //eg14.实现strcpy函数
    /*********************************************************
    char str1[] = "sssss";
    char str2[] = "jjjjj";
    char *strcpy(char *dest, const char *src)
    {
      char* address = dest;
      while((*address++ = *src++) != '\0');
      return address;
    }
    strcpy(str1, str2);
    cout << str1 < right)
      {
       return -1;
      }
      if(element == array[mid])
      {
       return mid;
      }
      else if(element < array[mid])
      {
       return Search(array, element, left, mid - 1);
      }
      else
      {
       return Search(array, element, mid + 1, right);
      }
    }
    //非递归
    int Search(int array[], int element, int n)
    {
      int left = 0, right = n;
      int mid;
      while((left <= right))
      {
       mid = (left + right) / 2;
       if(array[mid] == element)
       {
        return mid;
       }
       else if(element < array[mid])
       {
        right = mid -1;
       }
       else
       {
        left = mid + 1;
       }
      }
      return -1;
    }
    int n = Search(array, 5, 9);
    cout << n < 0 ? num : -num);
      while(temp){ temp /= 10; count++;}
      temp = num > 0 ? num : (count++, -num);
      *(str + count) = '\0';
      while(count > 0)
      {
       *(str + (--count)) = temp % 10 + '0';
       temp /= 10;
      }
      return num > 0 ? str : (str[0] = '-', str);
    }
    char *ltoa(const long long num, char* str)
    {
      int count = 0;
      long long temp = (num > 0 ? num : -num);
      while(temp){ temp /= 10; count++;}
      temp = num > 0 ? num : (count++, -num);
      *(str + count) = '\0';
      while(count > 0)
      {
       *(str + (--count)) = temp % 10 + '0';
       temp /= 10;
      }
      return num > 0 ? str : (str[0] = '-', str);
    }

    const char* str = "-2147483647";
    long number = atoi(str);
    cout << number << endl;
    long long num = -32147483647L;
    char array[16];
    char* strr = array;
    str = ltoa(num, str);
    cout << "结果是:" << strr << endl;
    ***********************************************************/
    //eg18. 联合
    /*********************************************************
    //赋值为0x4241,则在内存中存放的顺序是0x41 0x42 转换为十进制则为 65 66 A B
    //由于联合与结构体共用内存,而第二次赋值在内存中存放为b a 98 97 转换为十进制6261
    union
    {//定义一个联合
      int i;
      struct
      {//在联合中定义一个结构
       char first;
       char second;
      }half;
    }number;
    number.i=0x4241; //联合成员赋值
    printf("%c%c\n", number.half.first, number.half.second);
    number.half.first='a'; //联合中结构成员赋值
    number.half.second='b';
    printf("%x\n", number.i);
    ***********************************************************/
    return 0;
    }

分类:默认分类|回复:0|浏览:1359|全站可见|转载
 

下一篇: QGraphics解决方案

上一篇: 吊四级赋

Powered by phpwind v8.7 Certificate Copyright Time now is:04-30 06:32
©2005-2016 QTCN开发网 版权所有 Gzip disabled