c语言基础笔试坑点

1、#define N 5 + 5

  求 k = N*N*5

  错误解法:10*10*5 = 500

  正解(重点:注意黄色部分):5 + 5 * 5 + 5 * 5 = 55

 

2、死锁的必要条件:

   1、相互排斥使用(资源独占)

     一个资源每次仅仅能给一个进程使用 

   2、不可强占(不可剥夺)
       资源申请者不能强行的从资源占有者手中夺取资源,资源仅仅能由占有者自愿释放 

   3、请求和保持(部分分配,占有申请)
     一个进程在申请新的资源的同一时候保持对原有资源的占有(仅仅有这样才是动态申请,动态分配) 

   4、循环等待
    存在一个进程等待队列
       {P1 , P2 , … , Pn},
       当中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路

 

3、地址偏移:

   int arr[6] = { 1,2,3,4,5,9};

   偏移一个地址:     

    int *p = (int *)( &arr[0]+1);

   整体偏移:

    int *p = (int *)( &arr + 1);

  printf("%d %d\n", *(arr+1), *( p ) );

 

4、陷阱(进制间转换)

  unsigned long *p2;
  p2 = ( unsigned long *)0x709000;
  printf("  p2 +5 = %p , p2 = %p\n", p2 +5, p2 );

  答案: 0x709028, 0x709000 

 

5、 写出 float x 与 “零值” 比较的if语句

  const float EPSINON = 0.00001;                           

  if ( (x >= -EPSINON) && (x <= EPSINON) )  //EPSINON 是允许的误差,只要在这个范围内就说明 x 与 0 是相等的

6、switch 语句 的类型不能是 float型

 

7、cost 用法:

  -》const :常量内容不可变 : const int a  = 2;

  -》常量指针 :int const *a ,内容不可变

  -》指针常量:int * const a ,a指向的地址不可变

  -》混搭:int * const *a,a指向的内容和地址都不可变

  -》底层const:

      -》指针:指针指向的对象是常量

      -》任意对象:内容是常量

  -》顶层const:

      -》指针:指针本身就是常量

      -》任意对象,值是常量

  延伸:

    -》const 与 constexpr(c+11新增标准):

      1)相同点:大部分场景使用一样,定义普通常量

      2)不同点:

        -》constexpr 表达式的值 在编译时 就能确定,const 在运行时 确定

        -》指针方面:

          const:       const  int *p = nullptr;        // p 为指向常量的 指针

          constexpr:constexpr int *q = nullptr; // q 为 常量指针

 

      3)constexpr作用:因在编译时就确定值,极大提高程序的调用效率

 

 

  

 

8、sizeof计算空间大小

  易错点:

    -》数组名:当函数参数时 被认为是指针,所以空间大小为4

      void Fun( char str[100] )

      {

        sizeof( str) = ?  // 易写为100,正确为4

      }

 

9、算法题:

  -》字符串:

    比较两个字符串是否相等:

      const *src,const *dst;

       int ret = 0;

        while(  !( ret = *( unsigned char*)src - *( unsigned char * )dst )   && *dst )

       { ++src }

 

10、用宏定义得到一个字的高位和低位字节

  #define byte char
  #define word short
  #define WORD_LO(xxx) ((byte) ((word)(xxx) & 255))
  #define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8))

  short a = 256;

  printf("WORD_HI: %d WORD_LO: %d\n",WORD_HI(a),WORD_LO(a)); //a = 256 1_0000_0000

 

11、函数缺省类型,默认是 int 整型。

  

posted @ 2020-02-07 16:16  dcli  阅读(126)  评论(0)    收藏  举报