第二天看《C陷阱与缺陷》,果然都是我犯过的错啊!!!

前言

一、=不同于==

二、&和|不同于&&和||

三、词法分析中的“贪心法”

四、整型常量

五、字符与字符串

总结


 

前言

        在程序中单个字符是没有意义的,只有结合上下文才能知道具体的意思。换句话说,就是字符本身的意义是不变的,但组成符号的字符有它的顺序,同一组字符序列在不同上下文环境中的意思也不同。        

  • 上面的话看起来很拗口,举例解释一下

    p->s = "->";
  • 上述语句中有两个符号'->'首先对于字符'-'和'>'来说本身的意思不变,就是一个普通的字符,有自己对应的ASCII值。然后就是第一个'->'表示的是指针引用,第二个'->'是字符串。

        第一章词法“陷阱”,主要探讨符号与组成符号的字符之间的关系,以及一些符号含义的常见误解。在编译器中,词法分析器将程序分解成一个个符号。


一、=不同于==

  • 在有的编程语言中以符号:=作为赋值运算符,符号=作为比较运算符。而C语言是以符号=作为赋值运算符符号==作为比较运算符来使用的。

  • 这就导致了一个问题在进行比较运算的时候,错误的把==写成=

  • 解决办法进行比较运算的时候把比较的对象写在前面(一般是与数值进行比较)

  • 如下所示,在将100与x进行比较时,写成100==x,这样就不会错写成100=x。如果是以常规的方式写成x==100,很容易写成x=100

int x = 10;
if(100 == x)
    printf("真厉害!!!");

二、&和|不同于&&和||

  • C语言中的按位运算符很容易与逻辑运算符混淆

  • 记住:位运算是& |,逻辑运算是&& ||

三、词法分析中的“贪心法”

  • 在C语言中,只有一个字符组成的符号称为单字符符号,那么包含多个字符的就是多字符符号

  • C语言编译器在读入字符时会遇到这样一个问题我要读多少字符才可以结束???读多少字符组成一个符号???

  • 解决办法每个符号应该包含尽可能多的字符

  • 在这里我们再深入了解一下编译器将程序分解成符号的方法:从左到右一个字符一个字符读入,如果这个字符可能组成一个符号,继续读入下一个,判断该字符能否与之前读入的共同组成一个符号;如果可以就继续读入,重复上述操作,直到读入的字符组成的字符串不可能组成一个有意义的符号

  • 以上就是“贪心法”

  • 还需要注意除字符串与字符常量,符号的中间不能有空白(空格符、换行符、制表符)

四、整型常量

  • 一个整型常量的开头是数字0,则该常量被视为八进制数

  • 一个整型常量的开头是0x,则该常量被视为十六进制数

五、字符与字符串

  • 单引号引起的一个字符实际上代表一个整数,对应的ASCII值。如'a'的含义与97严格一致

  • 双引号引起的字符串代表的是一个指向无名数组起始字符的指针如字符串“Hello world\n”,以数组形式表示就是hello[ ] = {'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n', '\0'}


 

总结

  • 对于词义“陷阱”来说,我觉得其实还是在程序编写的过程中,对于变量、函数名等的定义,避免引起二义性

  • 对于C语言本身自带的操作符的使用也要注意

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

盾山狂热粉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值