@[TOC]
前言:
博主实力有限,有什么错误,请你斧正,非常感谢!博文属于<<c陷阱与缺陷>>专栏,后面会持续更新.
第一章 :词法陷阱
当我们对一段英语短句进行理解时,我们关注的是单词
,而不是字母
。同样对于c语言等编程语言所写的程序:当我们阅读一句程序时,并不考虑
单个字符
,而是对字符组成的符号
进行理解。
1. 赋值运算符=与比较运算符==
对于赋值运算符=
:如果用于逻辑判断时,其逻辑值是
0
或者非0
值。对于比较运算符
==
:其;逻辑值只有
`0或者1
2.按位与&,按位或|,逻辑且&&,逻辑或||
按位与&:
1.&是双目运算符 2.esp: a&b 其是对a与b的 二进制补码
中的每位
进行比较运算。a或者b中只要一边二进制补码对应位中是0,那么新的二进制位对应位就为0按位或|
1.双目运算符 2.esp:a\ b 其是对a与b的 二进制补码
中的每位
进行比较运算。a或者b中只要一边二进制补码对应位中是1,那么新的二进制位对应位就为1逻辑且&&
1.双目运算符 2.两边只要一边为假(0),表达式就为假。且具有改变运算性质的属性, 即(a&&b)一旦a为假,b表达式就不需要计算,逻辑判断最终结果直接为假 逻辑或||
1.双目运算符 2.两边只要一边为真(1),表达式就为真。且具有改变运算性质的属性, 即(a&&b)一旦a为真,b表达式就不需要计算,逻辑判断最终结果直接为真
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
,那么该常量被视作八进制
5.字符与字符串
- 用单引用引起的一个字符,实际是一个整形数。根据ASCII原则,每个字符对应一个十进制数。
- 对与双引号引起的字符串,其实质:是一个无名数组起始字符的==指针==,该数组被双引号之间的字符以及一个额外的二进制为0的==字符串结束标志‘\0’初始化==
- 因此
单引号
实质是整形,双引号
实质是指针。混用时,编译器会检查出来。对于‘yes’这种是合法的,但是对于不同编译器,其对应整数不同
Borland C++ v5.5和 LCC v3.6 中的做法是:忽略多余字符,最终整数值是第一个
字符的整数值.Visual C++ 6.0和 GCC v2.95中做法是:忽略多余字符,最终整数值是
最后一个
个字符的整数值.
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