C语言进阶:C陷阱与缺陷(读书笔记一)

最近读了一本C语言书《C陷阱与缺陷》,还不错,挺适合刚刚工作后的人,特此分享读书笔记,写代码时应注意这些问题,笔记已做精简,读完大概需要5min。

C陷阱与缺陷

  • 一、词法陷阱
    • 1、= 不同于 ==
    • 2、&和|不同于&&和||
    • 3、单字符符号与多字符符号
    • 4、整形常量
    • 5、字符与字符串 ||
  • 二、语法陷阱
    • 1、理解函数声明
    • 2、运算符的优先级问题
    • 3、注意作为语句结束标志的分号
    • 4、switch语句
    • 5、函数调用
    • 6、悬挂 else引发的问题

一、词法陷阱

1、= 不同于 ==

将比较值放在左边,变量放到右边,例如if(NULL==p->s)

2、&和|不同于&&和||

按位运算符 &(相同1才取1) 和 |(有一个1便为1) ;逻辑运算符 &&(and)和|| (or) ;
0111 1101 & 1111 0000 =0111 0000 ;0111 1101 |1111 0000 = 1111 1101
If(a>10&&b10) if(a>10 || b10)

3、单字符符号与多字符符号

每个符号应该包含尽可能多的字符:从左到右一个一个字符读入,如果字符组成一个符号,那么再读入下一个字符,判断已经读入的两个字符串是否可能是一个符号的组成部分,如果可能,继续上面的判断,知道读入的字符不再可能组成有意义的符号。
例如:(a*(b+c)))
a—b 与a-- -b 含义相同,但与 a- --b含义不同,y = x /*p 这里是会出现错误,应该写作y= x / *p ;或者y = x /(*p)

4、整形常量

如果一个整形常量的第一个字符是0,那么该常量将被视作8进制数。因此,10和010的含义截然不同,转换为十进制 1010,0108

5、字符与字符串 ||

字符用 char hello[ ]={‘h’,’e’,’l’,’l’,’o’,’\n’} 与 char hello[ ] ={“hello\n”} 等效

二、语法陷阱

1、理解函数声明

当计算机启动时,硬件将调用首地址为0位置的子例程
假设fp是一个指向返回值为void类型的函数的指针。
void (fp) ();
(fp) ();
对常数进行一个类型转换,将其转型为该变量的类型,如将常数0,转型为 “指向返回值为void的函数的指针”类型,如( void (
) () ) 0
用( void (
) () ) 0替换fp
(( void () () ) 0) ();

2、运算符的优先级问题

逻辑运算符(&& 、||)的优先级低于关系运算符(>、<、=)
移位运算符(&、|)的优先级比算数运算符(+、-、*、/、%)要低,但比关系运算符要高

3、注意作为语句结束标志的分号

例如
 if(x[i]>big); 
     Big =x[i];

  if(x[i]>big)
   Big =x[i];
    截然不同。

还例如

    If(n<3)
       return
       date = x[0];       time= x[1];       code= x[2];
这里的return 会跳转到 date = x[0]; 而不是返回。
       If(n<3)
       Return;
       date = x[0];       time= x[1];       code= x[2];
第三种
Struct log{
Int date;
Int time;
Int code;
}

main()
{

}
main()的类型为log型
与
Struct log{
Int date;
Int time;
Int code;
}main()
{

}
main()的类型未定

4、switch语句

不要忘记break;语句

5、函数调用

假设f是一个函数,那么
f(); //是一个函数调用
f; //什么也没做,准确来说,这个语句计算函数f的地址,但并不调用该函数

6、悬挂 else引发的问题

   if(x==0)
       if(y==0) error();
   else{
        z=x+y;
        f(&z);
       }


  if(x==0)
{
         if(y==0)
          error();
         else{
              z=x+y;
              f(&z);
              }
}


   if(x==0)
{
 if(y==0)
 error();
}
   else{
        z=x+y;
        f(&z);
}

建议用{ }封装if与else部分的执行函数,在这里插入代码片
C陷阱与缺陷(读书笔记二)
C陷阱与缺陷(读书笔记三)
C陷阱与缺陷(读书笔记四)
C陷阱与缺陷(读书笔记总)

你可能感兴趣的:(C语言进阶,c语言,开发语言)