c陷阱与缺陷第一章

文章目录

  • 前言:
  • 第一章 :词法陷阱
    • 1. 赋值运算符=与比较运算符==
    • 2.按位与&,按位或|,逻辑且&&,逻辑或||
    • 3.词法分析中的“贪心法”
    • 4.整形变量:
    • 5.字符与字符串
    • 6.练习
    • 7. 解析

前言:

博主实力有限,有什么错误,请你斧正,非常感谢!

博文属于<>专栏,后面会持续更新.

第一章 :词法陷阱

当我们对一段英语短句进行理解时,我们关注的是单词,而不是字母

同样对于c语言等编程语言所写的程序:当我们阅读一句程序时,并不考虑单个字符,而是对字符组成的符号进行理解。

1. 赋值运算符=与比较运算符==

对于赋值运算符 =:

如果用于逻辑判断时,其逻辑值是0或者非0值。

对于比较运算符==

其;逻辑值只有``0或者1`

c陷阱与缺陷第一章_第1张图片

2.按位与&,按位或|,逻辑且&&,逻辑或||

按位与&:

1.&是双目运算符
2.esp: a&b
其是对a与b的二进制补码中的每位进行比较运算。a或者b中只要一边二进制补码对应位中是0,那么新的二进制位对应位就为0
c陷阱与缺陷第一章_第2张图片

按位或|

1.双目运算符
2.esp:a|b
其是对a与b的二进制补码中的每位进行比较运算。a或者b中只要一边二进制补码对应位中是1,那么新的二进制位对应位就为1
c陷阱与缺陷第一章_第3张图片

逻辑且&&

1.双目运算符
2.两边只要一边为假(0),表达式就为假。且具有改变运算性质的属性,
即(a&&b)一旦a为假,b表达式就不需要计算,逻辑判断最终结果直接为假
c陷阱与缺陷第一章_第4张图片

逻辑或||

1.双目运算符
2.两边只要一边为真(1),表达式就为真。且具有改变运算性质的属性,
即(a&&b)一旦a为真,b表达式就不需要计算,逻辑判断最终结果直接为真
c陷阱与缺陷第一章_第5张图片

3.词法分析中的“贪心法”

  • 对于比较运算符‘==’,在程序中,编译器是怎么判断出的。

规则如下:

编译器将程序分解成符号,从左到右一个一个字符读入,如果读入的字符组成的字符串是·有意义的符号,就继续读,直到读入的字符组成的字符串不能组成一个有意义的符号,那么该读入所组成的字符串即为一个符号。
exp1:a - - -b
1.读入a,继续读。读入-,"a-"不能在组成有意义符号,"a"做为符号
2.从第一个-读入,继续读,读完后组成字符串"--",继续读,"---",不能再组成一个符号。
3.从第三个'-',读入,再读入b,-b无意义,``’-'做为一个符号
4. 读入b,无法再读,b做为符号
5.实际为 (a–)-(b)
exp2:y=x/*p
在读入'/'后,读入'*',再读入'p'/*p无意义符号。因此"/ *"做为注释符。
exp3:y=/ *p
在读入/ 后,空格读入,但是 / 无意义。因此/做为除法符号.所以最后 原式即是 y= / (* p)

4.整形变量:

如果整形常量的第一个字符是数字0,那么该常量被视作八进制

c陷阱与缺陷第一章_第6张图片

5.字符与字符串

  • 用单引用引起的一个字符,实际是一个整形数。根据ASCII原则,每个字符对应一个十进制数。

  • 对与双引号引起的字符串,其实质:是一个无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制为0的字符串结束标志‘\0’初始化

  • 因此单引号实质是整形,双引号实质是指针。混用时,编译器会检查出来。

  • 对于‘yes’这种是合法的,但是对于不同编译器,其对应整数不同

    Borland C++ v5.5和 LCC v3.6 中的做法是:忽略多余字符,最终整数值是第一个字符的整数值.

    Visual C++ 6.0和 GCC v2.95中做法是:忽略多余字符,最终整数值是最后一个个字符的整数值.

    c陷阱与缺陷第一章_第7张图片

6.练习

1.n–>0的含义是(n–) >0,还是 (n- ) ->。
2.a+++++b的含义是什么,以及其形式是否正确。

7. 解析

1.是 (n–)> 0;
贪心法中,"n-" 虽然有意义,但是需要继续读入,因此"--"做为自减符号,"-->"无意义符号
2((a++)++ )+b
但是对于++其必需修饰可改的值,而a++引用后是一个常量值,不符合规则。

对《c陷阱与缺陷》感兴趣的,请到网盘自行下载

链接:https://pan.baidu.com/s/1VV5xitjQPKAEHhLhyA3CBQ
提取码:2021

你可能感兴趣的:(c陷阱与缺陷,c语言)