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

本文分享了《C陷阱与缺陷》一书中的关键点,包括词法和语法方面常见的编程陷阱,如混淆赋值与比较操作符,位运算与逻辑运算的区别,以及函数声明、运算符优先级、分号使用、switch语句和函数调用的注意事项。强调了理解和避免这些陷阱对提高C语言编程质量的重要性。
摘要由CSDN通过智能技术生成

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

一、词法陷阱

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陷阱与缺陷(读书笔记总)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小师兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值